今天看的代理模式,这个模式使用率很高,它有两个主要特点,1.真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事物。2.具体主题角色是随时都会发生变化的,只要它实现了接口,不管如何变化,都无法逃过接口掌控,我们的代理类完全可以不做任何修改的情况下使用
在IOS中,在使用tableview,scrollview等控件的时候,苹果要求实现其代理,就是使用的这个模式
代理模式的简单定义
import Foundation
class Subject : NSObject {
func request() {
}
}
import Foundation
class RealSubject: Subject {
override func request() {
//具体实现
}
}
import Foundation
class Proxy: Subject {
var subject: Subject?
init(Obj:Subject) {
self.subject = Obj
}
func before() {
//预处理
}
func after() {
//善后处理
}
override func request() {
self.before()
self.subject?.request()
self.after()
}
}
代理模式有两个扩展,一普通代理,二强制代理
普通代理:(下面举个例子,它的要求就是客户端只能访问代理角色,而不能访问真实角色)
import Foundation
class VirtualGamePlayer: NSObject {
func login(User:String, Password:String) {
}
func killBoss() {
}
func upgrade() {
}
}
import Foundation
class GamePlayer: VirtualGamePlayer {
var name:String = ""
init(gameplayer:VirtualGamePlayer?,Name:String) {
super.init()
if gameplayer == nil {
print("真实角色为空")
}else {
self.name = Name
}
}
override func killBoss() {
print("\(self.name)+打怪!")
}
override func login(User: String, Password: String) {
print("\(User)+\(Password)")
}
override func upgrade() {
print("\(self.name)升级了")
}
}
import Foundation
class GamePlayerProxy: VirtualGamePlayer {
var gameplayer:VirtualGamePlayer?
init(gpName:String) {
super.init()
gameplayer = GamePlayer(gameplayer: self,Name: gpName)
}
override func killBoss() {
self.gameplayer?.killBoss()
}
override func login(User: String, Password: String) {
self.gameplayer?.login(User, Password: Password)
}
override func upgrade() {
self.gameplayer?.upgrade()
}
}
//main函数
let gmProxy:GamePlayerProxy = GamePlayerProxy(gpName: "里斯")
gmProxy.login("lisi", Password: "123")
gmProxy.killBoss()
gmProxy.upgrade()
强制代理模式 明天再整理