外观模式(门面模式):其实就是通过包装,我们可以在外界去调用统一的接口,可以这么说在外面我们所能看到的是外观对象,而不会看到里面的实际的操作,和里面的对象,这样的话其实就是让我们的代码更加好阅读,以及增强了可维护性。
外观模式的基本概念就是
要求一个子系统的外部和其内部的通信必需通过一个统一的对象进行也就是门户 |
外观模式提供了一个高层次接口,使得子系统更易于使用 |
就好比我们如果要把很多类的对象都去创建出来,然后用于某个功能,也就是说我们在外界需要去处理全部的细节才可以去实现这样的功能,如果我们直接在控制器中这样做的话,后期不好维护。所以其实我们可以把这些对象的组合抽成一个接口让外界进行调用。
有些时候我们只需要子系统中的某些的基本行为,而不需要去做什么定制的话,其实外观模式给我们提供了一个简化的接口,这样处理起来方便。这样也解决了客户端与我们的这些类中的耦合关系。
结构图:
客户端(Client):也就是调用Facade对象去完成相应的功能的角色。
外观(Facade):就是提供一个接口,让客户端去调用,里面知道各个子系统的功能,一个外观类中可以有多个子系统。
子系统(SubSystem):就是实现了子系统中的功能,处理Facade对象所下发的任务,每一个子系统其实也可以为客户端所调用。
下面就举个简单的例子,其实就是电脑聚合了相机、游戏、听音乐的功能,使用的外观模式的案例,其实就是将相机、游戏、音乐各自抽出来当做一个子系统,然后外界通过电脑可以去调用这些功能
相机模块
import UIKit
//相机模块->接口
protocol CamaraProtocol {
func open()
func takePicture()
func close()
}
具体实现类
import UIKit
class CamaraImpl: CamaraProtocol {
func open(){
print("开启相机")
}
func takePicture(){
print("开始拍照")
}
func close(){
print("关闭相机")
}
}
游戏模块
import UIKit
protocol GameProtocol {
func open()
func startGame()
func close()
}
具体实现
import UIKit
class GameImpl: GameProtocol {
func open(){
print("启动游戏")
}
func startGame(){
print("开始游戏")
}
func close(){
print("关闭游戏")
}
}
播放音乐模块
import UIKit
//播放模块
protocol MusicProtocol {
func open()
func startMusic()
func close()
}
具体实现
import UIKit
class MusicImpl: MusicProtocol {
func open(){
print("开启音乐")
}
func startMusic(){
print("开始播放")
}
func close(){
print("关闭播放")
}
}
再者就是系统对外统一的接口就是Computer类,也就是外观类
import UIKit
class Computer: NSObject {
private var camara:CamaraProtocol
private var game:GameProtocol
private var music:MusicProtocol
override init() {
self.camara = CamaraImpl()
self.game = GameImpl()
self.music = MusicImpl()
super.init()
}
//开启相机
func startCamara() {
//启动相机,预览画面,开始拍照
self.camara.open()
self.camara.takePicture()
}
//玩游戏
func playGame() {
//启动游戏,加载游戏,开始游戏...
self.game.open()
self.game.startGame()
}
//听音乐
func playMusic() {
//...
self.music.open()
self.music.startMusic()
}
}