python学习 - 设计模式 - 观察者模式实例代码

#!/usr/bin/python
# -*- coding:UTF-8 -*-
# @File    : d1.py
# @Software: PyCharm

# 第一版双向耦合代码

# 秘书类
class Secretary():
    def __init__(self):
        self.people = []
        self.action = ""

    def addPeople(self, people):
        self.people.append(people)

    # 通知
    def Notify(self):
        for i, v in enumerate(self.people):
            v.Updata()

    # 前台状态
    def SecretaryAction(self, actiom):
        self.action = actiom


# 看股票观看者
class StockObserver():
    def __init__(self, name, sub):
        self.name = name
        self.sub = sub

    def Updata(self):
        print "%s,%s,关闭股票行情,继续工作" % (self.sub.action, self.name)


# 解耦实践一



if __name__ == '__main__':
    # 前台
    secretary = Secretary()
    # 看股票的同事
    stockobserver1 = StockObserver("小王", secretary)
    stockobserver2 = StockObserver("小李", secretary)

    secretary.addPeople(stockobserver1)
    secretary.addPeople(stockobserver2)
    # 发现老板回来改变状态
    secretary.SecretaryAction("老板回来了!")
    # 通知人员
    secretary.Notify()

#!/usr/bin/python
# -*- coding:UTF-8 -*-
# @File    : d2.py
# @Software: PyCharm
from abc import ABCMeta, abstractmethod


# from d1 import *
# 抽象观察者
class Observer():
    __metaclass__ = ABCMeta  # 本类为抽象类

    def __init__(self, name, sub):
        self.__name = name
        self.__sub = sub
    # 更新状态
    @abstractmethod
    def Update(self):
        pass

class NBAObserver(Observer):
    def __init__(self, name, sub):
        self.name = name
        self.sub = sub

    def Update(self):
        print "%s,%s,关闭NBA直播,继续工作" % (self.sub.action, self.name)


# 股票观察者
class StockObserver2(Observer):
    def __init__(self, name, sub):
        self.name = name
        self.sub = sub

    def Update(self):
        print "%s,%s,关闭股票行情,继续工作" % (self.sub.action, self.name)


class Secretary2():
    def __init__(self):
        self.people = []
        self.action = ""

    def addPeople(self, people):
        self.people.append(people)

    def delPeople(self, people):
        del self.people[people]

    # 通知
    def Notify(self):
        for i, v in enumerate(self.people):
            v.Update()

    # 前台状态
    def SecretaryAction(self, actiom):
        self.action = actiom


if __name__ == '__main__':
    secretary2 = Secretary2()

    nbaobserver1 = NBAObserver("小N",secretary2)
    stockobserver2 = StockObserver2("小古",secretary2)
    secretary2.addPeople(nbaobserver1)
    secretary2.addPeople(stockobserver2)
    secretary2.SecretaryAction("胡汉三来了")
    secretary2.Notify()


    pass

#!/usr/bin/python
# -*- coding:UTF-8 -*-
# @File    : d3.py
# @Software: PyCharm

# 双向解耦 抽象观察者,抽象通知者
from abc import ABCMeta, abstractmethod
# 通知者接口
class Subject3():
    __metaclass__ = ABCMeta
    def __init__(self):
        self.peopleList = []
        self.subjectStatce = ""
    @abstractmethod
    def addPeople(self):
        pass
    @abstractmethod
    def delPeople(self):
        pass
    # 通知
    @abstractmethod
    def Notify(self):
        pass
    # 通知状态
    @abstractmethod
    def subjecStatce(self):
        pass
# 观察者接口
class Obsevice3():
    __metaclass__ = ABCMeta

    def __init__(self, name, sub):
        self.name = name
        self.sub = sub

    @abstractmethod
    def Update(self):
        pass

# 股票观察者
class stickObserver3(Obsevice3):
    def Update(self):#AAA
        print "%s,%s,关闭股票行情,继续工作" % (self.sub.subjectStatce, self.name)

class NBAObserver3(Obsevice3):
    def Update(self):#BBB
        print "%s,%s,关闭NBA直播,继续工作" % (self.sub.subjectStatce, self.name)

class Boss3(Subject3):

    def addPeople(self, people):
        self.peopleList.append(people)

    def delPeople(self, people):
        self.delPeople(people)

    def Notify(self):
        for i, v in enumerate(self.peopleList):
            v.Update()

    def subjecStatce(self, subjectStatce):
        self.subjectStatce = subjectStatce

if __name__ == '__main__':
    # 通知者
    Boss3 = Boss3()

    # 看股票的同事
    stockobserver1 = stickObserver3("小王", Boss3)
    nbaobserver2 = NBAObserver3("小N", Boss3)

    Boss3.addPeople(stockobserver1)
    Boss3.addPeople(nbaobserver2)

    # 发现老板回来改变状态
    Boss3.subjecStatce("我胡汉三来了!!!")
    # 通知人员
    Boss3.Notify()
#!/usr/bin/python
# -*- coding:UTF-8 -*-
# @File    : 委托.py
# @Software: PyCharm

class A:
    def f_one(self, x):
        print"here is f_one"
        print"x=",x
        print"-"*100

    def f_two(self):
        print"here is f_two"
        print"-"*100

class B(A):
    def __init__(self):
        self._a = A()

    def f_three(self):
        pass

    def __getattr__(self, name):#相当于重写了__getattr__,利用__getattr_来实现委托的效果(其实委托就是甩锅的意思啦,B搞不定,甩锅给A)
        # print name,"???"
        return getattr(self._a, name)

if __name__ == '__main__':
    b_test=B()
    x=6
    b_test.f_one(x)
    b_test.f_two()
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python设计模式是一种用于解决特定问题的可重复使用的解决方案。在Python中,有许多常见的设计模式,如单例模式、工厂模式、观察者模式等。这些设计模式可以帮助开发人员更好地组织和管理代码,提高代码的可维护性和可扩展性。 在引用\[1\]中,我们介绍了桥梁模式,它是一种结构类设计模式。桥梁模式可以用于解耦抽象和实现部分,使它们可以独立地变化。在一个画图程序中,桥梁模式可以用于将图形和画笔进行解耦,使它们可以独立地变化。通过桥梁模式,我们可以定义不同类型的画笔,并将其与不同的图形进行组合,从而实现不同类型的图形绘制。 在引用\[2\]中,我们展示了如何使用桥梁模式来构造多种画笔。通过继承和重写父类的方法,我们可以定义不同类型的画笔,如普通画笔和画刷。每种画笔都有自己的绘制方法,并可以接受不同类型的图形作为参数进行绘制。 在引用\[3\]中,我们提到了Python原生不支持静态分派,但可以通过访问者模式实现一种基于类的“双分派效果”。访问者模式是一种行为类设计模式,它可以在运行时根据对象的类型动态选择方法的调用。通过访问者模式,我们可以实现多分派,即根据两个对象的类型选择不同的方法进行调用。 总之,Python设计模式是一种用于解决特定问题的可重复使用的解决方案。在Python中,有许多常见的设计模式,如桥梁模式、访问者模式等,它们可以帮助开发人员更好地组织和管理代码。 #### 引用[.reference_title] - *1* *2* *3* [Python的23种设计模式(完整版带源码实例)](https://blog.csdn.net/huangbangqing12/article/details/128655980)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值