携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情
设计模式相信大家都很熟悉了,但是越是基础的东西也越是需要经常的回顾与思考,于是着手写一个温故而知新的设计模式回顾系列。
在 8 月,准备把各个常用的不常用的设计模式都进行一次回顾,并大概聊一下各个模式的特点与在 iOS 中的大概使用场景与情况。
这里是设计模式回顾的第十四篇,外观模式的相关回顾。
外观模式
1、什么是外观模式
为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式由三个角色组成:
- 外观角色
- 子系统角色
- 使用角色
外观角色就是高层类,它知道子系统中可以所有实现的功能,并且定义了一些接口,实现了子系统功能的组合。
子系统角色就是实现了小的功能,它们是单独存在的,不必依靠于其他类。对于子系统而言外观角色和使用角色一样,都是调用它们的功能。
使用角色的话就是通过外观角色调用子系统角色,不需要知道子系统的详细实现和具体功能。
2、外观模式用在什么地方
- 当你要为一个复杂子系统提供一个简单接口时,这是外观模式最直接的使用之一。
- 客户程序与抽象类的实现部分之间存在着很大的依赖性,这里的解藕有些类似中介模式,通过一个中间层接触耦合性。不过并不能因此觉得两者相似,实际上,两者基本没有联系。
- 当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的入口点。当然使用这种情况的前提是你的子系统是层次结构的,而这种层次结构的子系统至少在 APP 中是不常见的。
3、外观模式的使用
- 定义一个外观角色类,在
.m
文件中引用所有子系统角色类 - 定义几个高层接口,在接口中实现子系统功能的组合
- 使用角色调用外观角色定义的接口。
4、总结
外观模式拥有解藕、易使用、易维护、屏蔽子系统等优点,主要是为了把一个复杂的、耦合度高的系统,变为一个模块化、耦合低的系统集合。
5、demo
SubSystem.swift
import UIKit
class WakeUpSubSystem: NSObject {
/// 什么地方醒来
var place : String?
/// 什么时间
var time : String?
/// 起床
func wakeUp() {
}
}
class CallSubSystem: NSObject {
/// 谁打来电话
var person : String?
/// 电话号码
var number : Int?
/// 打电话/响铃
func call() {
}
}
class ActionSubSystem: NSObject {
/// 吃饭
func haveAMeal() {
}
/// 跟朋友见面
func meetFriend() {
}
/// 与美女见面
func meetBeauty() {
}
}
Facade.swift
import UIKit
class Facade: NSObject {
let wakeup = WakeUpSubSystem()
let call = CallSubSystem()
let action = ActionSubSystem()
/// 好事 醒来打电话见好友
func good() {
wakeup.wakeUp()
call.call()
action.meetFriend()
}
/// 普通 被闹铃吵醒去吃饭
func normal() {
call.call()
wakeup.wakeUp()
action.haveAMeal()
}
/// 差 与美女聊天被闹铃吵醒
func bad() {
action.meetBeauty()
call.call()
wakeup.wakeUp()
}
}