clllll  

关于方法如何执行,如何处理。

责任链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

将这些对象连成一条链,并沿着这条链传递该请求。直到有一个对象处理它为止。

  • 抽象处理者、具体处理者、客户端

from abc  import  ABCMeta,abstractmethod

class Handler(metaclass=ABCMeta):

    @abstractmethod
    def handler_leave(self, day):
        pass

class GeneraManager(Handler):
    def handler_leave(self, day):
        if day < 10:
            print("总经理批准")
        else:
            print("不行哦")
   
class DeparmentManager(Handler):

    def __init__(self):
        self.next = GeneraManager()

    def handler_leave(self, day):
        if day <= 3:
            print("部门经理批准了")
        else:
            self.next.handler_leave(day)

class ProjectManager(Handler):
    def __init__(self):
        self.next = DeparmentManager()
   
    def handler_leave(self, day):
        if day <= 1:
            print("项目主管批准了")
        else:
            self.next.handler_leave(day)

观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,其他对象都能收到通知,并自动更新。

  • 抽象主题 、具体主题、抽象观察者、具体观察者
from abc import ABCMeta, abstractmethod

class Observer(metaclass=ABCMeta):
    @abstractmethod
    def update(self, notice):
        pass 

class Notice:
    def __init__(self):
        self.observers = [] 
    
    def attach(self, obs):
        self.observers.append(obs)
    
    def detach(self, obs):
        self.observers.remove(obs)
    
    def notify(self):
        for obs in self.observers:
            obs.update(self)

class StaffNotice(Notice):
    def __init__(self, company_info):
        super().__init__()
        self.__company_info = company_info

    @property
    def company_info(self):
        return self.__company_info

    @company_info.setter
    def company_info(self, info):
        self.__company_info = info
        self.notify() 
    
class Staff(Observer):
    def __init__(self):
        self.company_info = None 
    
    def update(self, notice):
        self.company_info = notice.company_info 
    
notice = StaffNotice("初始公司信息")

s1 = Staff()
s2 = Staff() 
notice.attach(s1)
notice.attach(s2)
print(s1.company_info)
print(s2.company_info)
notice.company_info = "发奖金了"
print(s1.company_info)
print(s2.company_info)

策略模式

定义一系列算法,把它们一个个封装起来,可以互相替换,使得算法可独立于使用它的客户而变化。

  • 抽象策略、具体策略、上下文
from abc import ABCMeta, abstractmethod

class Stragey(metaclass=ABCMeta):
    @abstractmethod
    def execute(self, data):
        pass 

class FastStragey(Stragey):
    def execute(self, data):
        print("快速处理数据")

class SlowStragey(Stragey):
    def execute(self, data):
        print("慢慢处理数据")

class Context:
    def __init__(self, stragey, data):
        self.stragey = stragey 
        self.data = data 
    
    def set_stragey(self, stragey):
        self.stragey = stragey 
    
    def do_stragey(self):
        self.stragey.execute(self.data)

data = "fajsdkfjaksdjfasdf"
s = FastStragey()
context = Context(s, data)
context.do_stragey()
f = SlowStragey()
context.set_stragey(f)
context.do_stragey()

模板方法

定义一个操作中的算法的骨架,将具体实现延迟到子类。
子类不改变算法的结构,重定义某些特定的步骤

  • 抽象类:定义抽象的原子操作。实现一个模板方法作为算法的骨架
  • 具体类:实现原子操作
from abc import ABCMeta,abstractmethod

class Window(metaclass=ABCMeta):
    @abstractmethod
    def start(self):
        # 特定步骤,延迟到子类实现。
        pass 

    @abstractmethod
    def repaint(self):
        pass 

    @abstractmethod
    def stop(self):
        pass 

    
    def run(self):
        # 模板方法,算法骨架
        self.start()
        self.repaint()
        self.stop() 

class MyWindow(Window):
    def start(self):
        print("start...")
    
    def stop(self):
        print("stop...")

    def repaint(self):
        print("repaint...")

MyWindow().run() 
posted on 2022-10-30 14:55  llcl  阅读(27)  评论(0编辑  收藏  举报