python设计模式-适配器设计模式,装饰器设计模式

适配器设计模式

适配器模式可用作两个不兼容接口之间的桥梁。 这种类型的设计模式属于结构模式,因为此模式结合了两个独立接口的功能。
这种模式涉及一个类,它负责连接独立或不兼容接口的功能。 一个现实的例子是读卡器,它是存储卡和笔记本电脑之间的适配器。 您将存储卡插入读卡器,将读卡器插入笔记本电脑,以便通过笔记本电脑读取存储卡。
适配器设计模式有助于类能在一起工作。 它根据需求将一个类的接口转换为另一个接口。 该模式包括一个多态性,它命名一个名称和多个形式。 根据收集到的要求,生成一个使用的形状类。
适配器模式有两种类型 -

  • 对象适配器模式 - 这种设计模式依赖于对象实现。 因此,它被称为对象适配器模式。
  • 类适配器模式 - 这是实现适配器设计模式的另一种方式。 该模式可以使用多重继承来实现。

如何实现适配器模式?

现在让我们看看如何实现适配器模式。参考以下代码

class EuropeanSocketInterface:
   def voltage(self): pass

   def live(self): pass
   def neutral(self): pass
   def earth(self): pass

# Adaptee
class Socket(EuropeanSocketInterface):
   def voltage(self):
      return 230

    def live(self):
      return 1

   def neutral(self):
      return -1

   def earth(self):
      return 0

# Target interface
class USASocketInterface:
   def voltage(self): pass
   def live(self): pass
   def neutral(self): pass

# The Adapter
class Adapter(USASocketInterface):
   __socket = None
   def __init__(self, socket):
      self.__socket = socket

   def voltage(self):
      return 110

   def live(self):
      return self.__socket.live()

   def neutral(self):
      return self.__socket.neutral()

# Client
class ElectricKettle:
   __power = None

   def __init__(self, power):
       self.__power = power

   def boil(self):
      if self.__power.voltage() > 110:
         print "Kettle on fire!"
      else:
         if self.__power.live() == 1 and \
            self.__power.neutral() == -1:
            print "Coffee time!"
         else:
            print "No power."

def main():
   # Plug in
   socket = Socket()
   adapter = Adapter(socket)
   kettle = ElectricKettle(adapter)

   # Make coffee
   kettle.boil()

   return 0

if __name__ == "__main__":
   main()

执行上面示例代码,得到以上结果
在这里插入图片描述
说明:代码包括具有各种参数和属性的适配器接口。 它包括Adaptee和Target接口,它实现所有属性并将输出显示为可见。

装饰器设计模式

装饰器模式允许用户在不改变其结构的情况下向现有对象添加新功能。 这种类型的设计模式属于结构模式,因为此模式充当现有类的包装。
这个模式创建了一个装饰器类,它封装了原始类,并提供了额外的功能,保持了类方法签名的完整性。
装饰者模式的动机是动态地附加对象的额外职责(功能)。

如何实现装饰设计模式?

下面提到的代码是如何在Python中实现装饰器设计模式的简单演示。 该示例涉及以类形式展示咖啡店(coffeeshop类)。 创建的 coffee 类是一个抽象类,这意味着它不能被实例化

import six
from abc import ABCMeta

@six.add_metaclass(ABCMeta)
class Abstract_Coffee(object):

   def get_cost(self):
      pass

   def get_ingredients(self):
      pass

   def get_tax(self):
      return 0.1*self.get_cost()

class Concrete_Coffee(Abstract_Coffee):

   def get_cost(self):
      return 1.00

   def get_ingredients(self):
      return 'coffee'

@six.add_metaclass(ABCMeta)
class Abstract_Coffee_Decorator(Abstract_Coffee):

   def __init__(self,decorated_coffee):
      self.decorated_coffee = decorated_coffee

   def get_cost(self):
      return self.decorated_coffee.get_cost()

   def get_ingredients(self):
      return self.decorated_coffee.get_ingredients()

class Sugar(Abstract_Coffee_Decorator):

   def __init__(self,decorated_coffee):
      Abstract_Coffee_Decorator.__init__(self,decorated_coffee)

   def get_cost(self):
      return self.decorated_coffee.get_cost()

   def get_ingredients(self):
       return self.decorated_coffee.get_ingredients() + ', sugar'

class Milk(Abstract_Coffee_Decorator):

   def __init__(self,decorated_coffee):
      Abstract_Coffee_Decorator.__init__(self,decorated_coffee)

   def get_cost(self):
      return self.decorated_coffee.get_cost() + 0.25

   def get_ingredients(self):
      return self.decorated_coffee.get_ingredients() + ', milk'

class Vanilla(Abstract_Coffee_Decorator):

   def __init__(self,decorated_coffee):
      Abstract_Coffee_Decorator.__init__(self,decorated_coffee)

   def get_cost(self):
      return self.decorated_coffee.get_cost() + 0.75

   def get_ingredients(self):
      return self.decorated_coffee.get_ingredients() + ', vanilla'

如下所述,coffeeshop抽象类的实现是通过一个单独的文件完成的

import coffeeshop

myCoffee = coffeeshop.Concrete_Coffee()
print('Ingredients: '+myCoffee.get_ingredients()+
   '; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))

myCoffee = coffeeshop.Milk(myCoffee)
print('Ingredients: '+myCoffee.get_ingredients()+
   '; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))

myCoffee = coffeeshop.Vanilla(myCoffee)
print('Ingredients: '+myCoffee.get_ingredients()+
   '; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))

myCoffee = coffeeshop.Sugar(myCoffee)
print('Ingredients: '+myCoffee.get_ingredients()+
   '; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))

执行上述程序生成以下输出
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

资料小助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值