Python常用設計モード(2)

14913 ワード

前回はよく使われる設計モードの一例モードと工場モードについて話しましたが、今日は戦略モードと観察者モードについて話します.
3.ポリシー・モード
策略とは、ある目的を達成するために取られた多様な手段や方法を指す.
ソフトウェア設計を実現するために、オブジェクトは多様なアルゴリズム(論理)を使用する可能性があります.これらのアルゴリズムは常に変化します.これらのアルゴリズムをオブジェクトにハードコーディングすると、オブジェクト自体が肥大化します.
ポリシーモードは、上記の問題を回避するために、アルゴリズムを自身のオブジェクトとデカップリングすることをよく実現する.
したがって、ポリシー・モードは、一連のアルゴリズム(論理)を定義し、各アルゴリズムをカプセル化し(アルゴリズムがクラスを作成し)、互いに置き換えることができるように定義することができる.
このモードはアルゴリズムの変化を、アルゴリズムを使用する顧客に影響を及ぼさない.ポリシー・モードの構造
ポリシー・モードには、Context(環境クラス)Strategy(抽象ポリシークラス)ConcreteStrategy(具体的なポリシークラス)の3つの役割があります.
class CashNOmal:
    def accept_money(self,money):
        return money
class CashRate:
    """  """
    def __init__(self,rate):
        self.rate=rate
    def accept_money(self,money):
        return money*self.rate
class CashReturn:
    """  """
    def __init__(self,condition,ret):
        self.condition=condition #    
        self.ret=ret #    
    def accept_money(self,money):
        # if money>=self.condition:
        #     return money-(money//self.condition)*self.ret
        # else:
        #     return money
        return money - (money // self.condition) * self.ret
class Context:
    """    """
    def __init__(self,cs):
        self.cs=cs

    def get_result(self,money):
        return self.cs.accept_money(money)

if __name__ =="__main__":
    zd={}
    zd[1]=Context(CashNOmal()) #    
    zd[2]=Context(CashRate(0.8)) #  
    zd[3]=Context(CashReturn(300,50)) #  
    culue = int(input("     :"))
    if culue in zd:
        cs=zd[culue]
    else:
        cs=zd[1]
    money=float(input("    :"))
    print(cs.get_result(money))

class CashNormal():
    def accept_money(self,money):
        return money
class CashRate():
    def __init__(self,rate):
        self.rate=rate

結果:
   :
     :1500
500.0

   :
     :2500
400.0

   :
     :3500
450.0

4.観察者モード
オブザーバー・モード:パブリッシュ・サブスクリプション・モードとも呼ばれ、複数のオブザーバー・オブジェクトがトピック・オブジェクトを同時にリスニングできるようにする一対の依存関係を定義します.このトピック・オブジェクトの状態が変化すると、すべてのオブザーバー・オブジェクトに通知され、自動的に自分を更新できます.
シーンの具体的な適用:イベント駆動システムはオブザーバモードの例です.このシステムでは、傍受者は特定のイベントを傍受するために使用される.リスナーがリスニングしているイベントが作成されると、それらがトリガーされます.このイベントは、特定のキーを入力したり、マウスを移動したりすることができます.イベントはパブリッシャーの役割を果たし、リスナーはオブザーバーの役割を果たす.ここで、キーは、単一のイベント(パブリッシャ)が複数のリスナー(オブザーバー)を関連付けることができることです.
class Monitor:
    """   ----》  ----》     """
    def __init__(self):
        self.observers=[] #       
        self.status=" "  #    
    def attach(self,observer):
        """        """
        self.observers.append(observer)
    def notify(self):
        """        """
        for observer in self.observers:
            observer.update()
class SleepStudentobserver:
    """   """
    def __init__(self,name,monitor):
        self.name=name #      
        self.monitor=monitor #     

    def update(self):
        print("{},{}      ".format(self.monitor.status,self.name))

if __name__ == "__main__":
    monitor=Monitor()
    obsercer1=SleepStudentobserver("zs",monitor)
    obsercer2=SleepStudentobserver("ls",monitor)
    monitor.attach(obsercer1)
    monitor.attach(obsercer2)
    monitor.status="     "
    monitor.notify()

結果:
     ,zs      
     ,ls      

*end~~~~*