Python两种模式,python23种设计模式

  Python两种模式,python23种设计模式

  一、Python创意设计模式

  1.工厂模式:解决对象创建问题。

  2.构建器:控制复杂对象的创建。

  3.原型:通过克隆原型来创建一个新的实例。

  4.单例模式(Brog/Singleton):一个类只能创建同一个对象。

  5.对象池模式:预先分配一组相同类型的实例。

  6.延迟计算模式:延迟计算(Python的特性)

  (1)工厂模式

  解决对象创建的问题,解耦对象的创建和使用,包括工厂方法和抽象工厂。

  #一个工厂方法的例子class dog:def speak(self):print( Wang Wang!)类猫:def speak(自):print(苗苗!)defanimal(speak _ type):if speak _ type== dog :return dog()elifspeak _ type== cat :return cat()(2)构造模式

  用于控制复杂对象的构造、创建和表示分离。比如你买了一台电脑,工厂模式会直接把你的电脑给你,而建造模式会让你自定义电脑的配置,组装后给你。

  #一个构造模式类计算机的例子:def __init__(self,serial _ number):self . serial=serial _ number self . Memory=None self . HDD=None self . GPU=None def _ _ str _ _(self):info=( Memory:{ } GB 。格式(自带内存),硬盘:{}GB 。格式(自带硬盘),“显卡:{}”。format(self.gpu))返回 \ n 。join(info)class Computer builder:def _ _ init _ _(self):self . Computer=Computer( XXXXXXXX )def configure _ memory(self,amount):self . Computer . hdd=amount def configure _ HDD(self,amount):self . Computer . HDD=amount def configure _ GPU(self,GPU _ model):self . Computer=GPU _ model class hardware engineer:def _ _ init _ _(self):self . builder=None def construct _ Computer(self,memory,HDD,GPU):self . builder=Computer builder()

  通过克隆原型创建新实例。您可以使用相同的原型,并通过修改一些属性来创建一个新的实例。目的:您可以在一些创建实例的成本很高的地方使用原型模式。

  (4)单一模式

  一个类创建的对象是一样的,比如Python模块是singleton,多次导入只会导入一次。您可以通过共享同一个实例来创建单例模式。

  # singleton模式classsingleton: def _ _ new _ _ (CLS,* args,* * kwargs): if not hasattr (CLS, _ instance): _ instance=super()。_ _ new _ _ (CLS,* args,* *夸尔格斯)CLS.

  二、结构设计模式

  1.Decorater模式:不需要子类化和扩展object函数。

  2.代理模式:将一个对象的操作代理给另一个对象。

  3.适配器模式:通过间接层适配统一接口。

  4.门面:简化复杂对象的访问问题。

  5.Flyweight:通过对象重用(pool)提高资源利用率,比如连接池。

  6.模型-视图-控制器(MVC):分离显示逻辑和业务逻辑

  (1)代理模式

  将一个对象的操作代理给另一个对象。这里可以使用堆栈/队列来代理对队列的操作。

  # agent mode 3354 stack from collections import deque类stack(object):def _ _ init _ _(self):self。_ deque=deque () def push (self,Value):返回self。_ deque . append(value)def pop(self):返回self。_ deque . pop()def empty(self):return len(self。_ deque)==0 (2)适配器模式

  把不同的对象的接口适配到同一个接口,当需要不同的对象统一接口的时候可以使用适配器模式

  类狗(object):def _ _ init _ _(self):self。name= Dog def bark(self):返回 woof 类猫(对象):def _ _ init _ _(自身):自身。name= Cat def苗(self):返回苗类Adapter: def __init__(self,obj,* * adapted _ methods):self。自己.__词典_ _。update(adapted _ methods)def _ _ get attr _ _(self,attr):返回getattr(self.obj,attr)objects=[]Dog=Dog()objects。append(Adapter(Dog,make _ noise=Dog。树皮))猫=猫()对象。append(适配器(Cat,make _ noise=Cat。bark))for obj in objects:print( A { 0 } goes { 1 }).format(obj.name,obj.make_noise()))三、行为型模式

  1、迭代器模式(迭代器):通过统一的接口迭代对象

  2、观察者模式(观察员):对象发生改变的时候,观察者执行相应的动作

  3、策略模式(策略):针对不同规模输入使用不同的策略

  (1)迭代器模式

  计算机编程语言内置对迭代器模式的支持,可以用为遍历各种可迭代的的数据类型,不可迭代对象需要用(__下一个_ _和__iter__)实现迭代器,可以迭代的对象只使用__iter__

  # 迭代器模式—— 可以迭代的堆栈形式集合导入dequeclass Stack(object):def _ _ init _ _(self):self ._deque=deque() def push(self,value):返回自我._ deque。追加(值)定义弹出(自身):返回自我._ deque。pop()def empty(self):return len(self ._ deque)==0 def _ _ ITER _ _(self):RES=[]for I in self ._ deque:RES . append(I)for I in reversed(RES):yield I

  (2)观察者模式

  发布订阅最为常见,发布订阅用于解耦逻辑,可以通过回调等方式实现,当条件发生时可以使用相应的回调函数

  # 发布订阅模式类发布者:def _ _ init _ _(self):self。观察者=[]def add(自身,观察者):如果观察者不在自己中,观察者:自我。观察者。附加(观察者)else:print(未能添加:{} 。format(观察者))def remove(自身,观察者):try:自身。观察者。删除(观察者)除外:打印(未能删除:{} 。format(observer))def notify(self):[o . notify _ by(self)for o in self。观察员]类格式化程序(Publisher): def __init__(self,name): super().__init__() self.name=name self ._ data=0 @属性定义数据(自身):返回自我._data @data.setter def data(self,new_value): self ._ data=int(new _ value)self。通知()类二进制格式化程序:def notify _ by(self,publisher): print({} : {}现在有ctdsb数据={} .格式(类型(自身))。__name__,publisher.name,ctdsb(publisher.data))) (3)策略模式

  根据不同输入采用不同的策略,对外暴露统一的接口,内部采用不同的策略计算

  # 策略模式类顺序:def __init__(self,price,discount _ strategy=None):self。价格=价格自我。discount _ strategy=discount _ strategy def Price _ after _ discount(self):如果self。折扣_策略:折扣=自我。discount _ strategy(self)else:discount=0返回self。价格折扣def _ _ repr _ _(self):fmt= Price:{ },折扣后价格:{} 返回fmt.format(self.price,self.price_after_discount())

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: