1. 观察者模式
观察者模式又名监听模式,主要就是描述观察者与被观察者的设计模式,这里面就需要提一嘴回调函数,也是我们编程中非常常用的一种方式,其也是观察者模式的一种实现方式,但主要针对的是一对一的监听,而观察者模式还存在一对多的观察模式(即多个观察者,观察一个被观察者)。观察者模式举例:你在下载一个东西,下载完成后需要被告知。那烧水的水壶就是被观察者,而你就是观察者。
2.指导思想
观察者模式是对象的行为模式。监听模式的核心思想就是在被观察者(Observable)与观察者(linstener/Observer)之间建立一种自动触发的关系。被观察者对象在状态或内容(数据)发生变化时,会通知所有观察者对象,使它们能够做出相应的变化(如自动更新自己的信息)。
3.框架思想
class Observer(metaclass=ABCMeta):
"""观察者的基类"""
@abstractmethod
def update(self, observable, object):
pass
class Observable:
"""被观察者的基类"""
def __init__(self):
self.__observers = []
# 添加观察者
def addObserver(self, observer):
self.__observers.append(observer)
# 删除观察者
def removeObserver(self, observer):
self.__observers.remove(observer)
# 内容或状态变化时通知所有的观察者
def notifyObservers(self, object=0):
for o in self.__observers:
o.update(self, object)
class kettle(Observable)
ef __init__(self):
super().__init__()
self.__temperature = 5
def getTemperature(self):
return self.__temperature
def setTemperature(self, temperature):
self.__temperature = temperature
print("当前的温度是", str(temperature), "℃")
self.notifyObservers()
class WaterMan(Observer):
"""喝水的人,观察者"""
def update(self, observable, object):
if isinstance(observable, kettle) \
and observable.getTemperature() = 100
print("水已经烧好,可以喝水了")
class TeaMan(Observer):
"""喝茶的类,继承父类(观察者的抽象类)"""
def update(self, observable, object):
if isinstance(observable, WasterHeater) \
and observable.getTemperature() = 100:
print("水已经烧开,可以泡茶了")
def test():
heater = WasterHeater() # 创建烧水壶类的对象
DrinkWater= WaterMan() # 创建喝水的对象
DrinkTea = TeaMan() # 创建喝茶类的对象
# 调用烧水壶对象的添加观察者(喝水类对象)的方法
heater.addObserver(DrinkWater)
# 调用烧水壶对象的添加观察者(喝茶类对象)的方法
heater.addObserver(DrinkTea )
# 设置各种温度
heater.setTemperature(100)
//使用test()方法
/*
运行结果:
当前的温度是 100 ℃
水已经烧好,可以喝水了
水已经烧开,可以泡茶了
*/
4. 另一类使用方法
将监听器作为接口创建,之后使用一个监听类实现监听接口,将其作为参数传入需要监听器的方法中使用。
interface TickerLinstener
{
fun onCompleted()
fun onProgress()
fun onError()
}
class TestTickerLinstener : TickerLinstener{
override fun onCompleted() {}
override fun onProgress() {}
fun onCompleted() {
logger.info("买到票了")
}
fun buyTickes(listener: TestTickerLinstener ?) {
buy()
listener.onCompleted()
}
}
5. 应用场景
(1) 对一个对象状态或数据的更新需要其他对象同步更新,或者一个对象的更新需要依赖另一个对象的更新
(2) 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节,如消息推送