美文网首页
设计模式之监听模式:坑爹的热水器

设计模式之监听模式:坑爹的热水器

作者: you的日常 | 来源:发表于2022-02-28 10:03 被阅读0次

    【故事剧情】

    刚刚大学毕业的 Tony 只身来到北京这个硕大的城市,开始了北漂的生活。但刚刚毕业的他身无绝技、包无分文,为了生活只能住在沙河镇一个偏僻的村子里,每天坐着程序员专线(13号线)来回穿梭于昌平区与西城区……

    在一个寒冷的冬天,下班之后要坐2个小时的地铁+公交才能回到住处,Tony 拖着疲惫的身体回到家。准备洗一个热水澡暖暖身体,耐何简陋的房子中用的还是90年代的热水器。因为热水器没有警报更没有自动切换模式的功能,所以烧热水必须得守着;不然时间长了成杀猪烫,时间短了又冷成狗。无奈的 Tony 背靠着墙,头望着天花板,深夜中做起了白日梦:一定要努力工作,过两个月我就可以自己买一个智能热水器了:水烧好了就发一个警报,我就可以直接去洗操。还要能自己设定模式,既可以烧开了用来喝,可以烧暖了用来洗澡……

    enter image description here

    用程序来模拟生活

    Tony 陷入白日梦中……他的梦虽然在现实世界里不能立即实现,但在程序世界里可以。程序来源于生活,下面我们就用代码来模拟 Tony 的白日梦。

    源码示例:

    class WaterHeater:
        "热水器:战胜寒冬的有利武器"
    
        def __init__(self):
            self.__observers = []
            self.__temperature = 25
    
        def getTemperature(self):
            return self.__temperature
    
        def setTemperature(self, temperature):
            self.__temperature = temperature
            print("current temperature is:", self.__temperature)
            self.notifies()
    
        def addObserver(self, observer):
            self.__observers.append(observer)
    
        def notifies(self):
            for o in self.__observers:
                o.update(self)
    
    class Observer:
        "洗澡模式和饮用模式的父类"
    
        def update(self, waterHeater):
            pass
    
    class WashingMode(Observer):
        "该模式用于洗澡用"
    
        def update(self, waterHeater):
            if waterHeater.getTemperature() >= 50 and waterHeater.getTemperature() < 70:
                print("水已烧好,温度正好!可以用来洗澡了。")
    
    class DrinkingMode(Observer):
        "该模式用于饮用"
    
        def update(self, waterHeater):
            if waterHeater.getTemperature() >= 100:
                print("水已烧开!可以用来饮用了。")
    
    

    测试代码:

    def testWaterHeater():
        heater = WaterHeater()
        washingObser = WashingMode()
        drinkingObser = DrinkingMode()
        heater.addObserver(washingObser)
        heater.addObserver(drinkingObser)
        heater.setTemperature(40)
        heater.setTemperature(60)
        heater.setTemperature(100)
    
    

    输出结果:

    current temperature is: 40
    current temperature is: 60
    水已烧好,温度正好!可以用来洗澡了。
    current temperature is: 100
    水已烧开!可以用来饮用了。
    
    

    从剧情中思考监听模式

    这个代码非常简单,水烧到50-70度时,会发出警告:可以用来洗澡了!烧到100度也会发出警告:可以用来喝了!在这里洗澡模式和饮用模式扮演了监听的角色,而热水器则是被监听的对象。一旦热水器中的水温度发生变化,监听者都能及时知道并做出相应的判断和动作。其实这就是程序设计中监听模式的生动展现。

    监听模式

    监听模式又名观察者模式,顾名思意就是观察与被观察的关系,比如你在烧开水得时时看着它开没开,你就是观察者,水就是被观察者;再比如说你在带小孩,你关注她是不是饿了,是不是喝了,是不是撒尿了,你就是观察者,小孩就是被观察者。

    观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。当你看这些模式的时候,不要觉得陌生,它们就是观察者模式。

    相关文章

      网友评论

          本文标题:设计模式之监听模式:坑爹的热水器

          本文链接:https://www.haomeiwen.com/subject/hwqbrktx.html