一、概述
Observer属于行为型模式中的一种,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
二、适用性
1. 当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2. 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
3. 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。
三、参与者
1. Subject(目标):目标知道它的观察者。可以有任意多个观察者观察同一个目标。提供注册和删除观察者对象的接口。
2. Observer(观察者):为那些在目标发生改变时需获得通知的对象定义一个更新接口。
3. ConcreteSubject(具体目标):将有关状态存入各ConcreteObserver对象。当它的状态发生改变时,向它的各个观察者发出通知。
4. ConcreteObserver(具体观察者):维护一个指向ConcreteSubject对象的引用。存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。
四、类图
五、代码实现
1. Subject(目标):目标知道它的观察者。可以有任意多个观察者观察同一个目标。提供注册和删除观察者对象的接口。
Citizen.swift
//
// Citizen.swift
// 23设计模式
//
// Created by 阳君 on 14/12/4.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// Citizen(目标)目标知道它的观察者。可以有任意多个观察者观察同一个目标。提供注册和删除观察者对象的接口
class Citizen {
/// 警察局列表
var pols:[Policeman] = []
/// 通知信息
var help:String = "normal"
init() {
}
// MARK: 子类实现
func sendMessage(help:String) {
}
// MARK: 注册
func register(pol:Policeman) {
self.pols.append(pol);
}
}
2. Observer(观察者):为那些在目标发生改变时需获得通知的对象定义一个更新接口。
Policeman.swift
//
// Policeman.swift
// 23设计模式
//
// Created by 阳君 on 14/12/4.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// Policeman(观察者)为那些在目标发生改变时需获得通知的对象定义一个更新接口。
protocol Policeman {
func action(citizen:Citizen)
}
3. ConcreteSubject(具体目标):将有关状态存入各ConcreteObserver对象。当它的状态发生改变时,向它的各个观察者发出通知。
a) HuangPuCitizen.swift
//
// HuangPuCitizen.swift
// 23设计模式
//
// Created by 阳君 on 14/12/4.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// 将有关状态存入HuangPuCitizen对象。当它的状态发生改变时,向它的各个观察者发出通知
class HuangPuCitizen: Citizen {
init(pol:Policeman) {
super.init()
self.register(pol)
}
override func sendMessage(help: String) {
self.help = help
for pol in self.pols {
//通知警察行动
pol.action(self)
}
}
}
b) TianHeCitizen.swift
//
// TianHeCitizen.swift
// 23设计模式
//
// Created by 阳君 on 14/12/4.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// 将有关状态存入TianHeCitizen对象。当它的状态发生改变时,向它的各个观察者发出通知
class TianHeCitizen: Citizen {
init(pol:Policeman) {
super.init()
self.register(pol)
}
override func sendMessage(help: String) {
self.help = help
for pol in self.pols {
//通知警察行动
pol.action(self)
}
}
}
4. ConcreteObserver(具体观察者):维护一个指向ConcreteSubject对象的引用。存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。
a) HuangPuPoliceman.swift
//
// HuangPuPoliceman.swift
// 23设计模式
//
// Created by 阳君 on 14/12/4.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// HuangPuPoliceman具体观察者
class HuangPuPoliceman: Policeman {
func action(citizen: Citizen) {
switch (citizen.help) {
case "normal":
print("一切正常, 不用出动!")
case "unnormal":
print("有犯罪行为, 黄埔警察出动!")
default:
print("default...")
}
}
}
b) TianHePoliceman.swift
//
// TianHePoliceman.swift
// 23设计模式
//
// Created by 阳君 on 14/12/4.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// HuangPuPoliceman具体观察者
class TianHePoliceman: Policeman {
func action(citizen: Citizen) {
switch (citizen.help) {
case "normal":
print("一切正常, 不用出动!")
case "unnormal":
print("有犯罪行为, 天河警察出动!")
default:
print("default...")
}
}
}
六、测试
1. 代码
// 观察者模式
let hpPol = HuangPuPoliceman()
var citizen:Citizen = HuangPuCitizen(pol: hpPol)
citizen.sendMessage("unnormal")
let thPol = TianHePoliceman()
citizen = TianHeCitizen(pol: thPol)
citizen.sendMessage("normal")
2. 运行结果
有犯罪行为, 黄埔警察出动!
一切正常, 不用出动!