python:水果与设计模式-适配器模式
Posted Spuer_Tiger
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python:水果与设计模式-适配器模式相关的知识,希望对你有一定的参考价值。
适配器模式(Adapter Pattern):属于结构型模式,它 结合了两个独立接口的功能,作为两个不兼容的接口之间的桥梁 。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
例如,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
意图: 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
。
主要解决: 主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。
何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要
。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中
。
如何解决: 继承或依赖(推荐)。
关键代码: 适配器继承或依赖已有的对象,实现想要的目标接口。
优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。4、灵活性好。
缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。
比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题
。
应用实例: 夏天除了水果,还有什么最配呢?当然是奶茶啦!于是,我们的水果工厂在橘子摊位(结合适配器的思想)最新推出了奶茶售卖活动,还不快来康康(σ゚∀゚)σ…:*☆呦!
那我们一起使用适配器模式,实现橘子摊位既可以买橘子也可以喝奶茶的功能吧!(づ。◕ᴗᴗ◕。)づ
实现的思路:
- 项目的核心包括3个部分:
Orange(橘子类)负责销售橘子以及售卖饮品
,DrinkAdapter(适配器)主要负责提供Orange购买饮品的接口
,而Drink(饮品类)主要负责奶茶/咖啡的生产,其中包括奶茶/咖啡的甜度、大小等
。
项目的UML用例图如下:
实现的代码如下:
class Orange:
def __init__(self, weight, flag=0, name=None, size=None, sweet=None):
self.fruit_name = "orange"
self.price = 17.0
self.weight = weight
self.flag = flag
self.drink_name = name
self.drink_size = size
self.drink_sweet = sweet
def buy_orange(self):
money = self.price * self.weight
print("-*-" * 7)
print("◎您购买的水果:%s\\n单价:%s(千克/元)\\n重量:%.2f千克\\n需支付的金额:%.2f元" %
(self.fruit_name, self.price, self.weight, money))
return money
def buy_drink(self):
drink_object = DrinkAdapter.drink_adapt(self.drink_name, self.drink_size, self.drink_sweet)
return drink_object
def show(self):
fruit_money = self.buy_orange()
if self.flag == 1:
drink_money = self.buy_drink().get_price()
else:
drink_money = 0
print("共计:%.2f元" % float(fruit_money + drink_money))
class DrinkAdapter:
@staticmethod
def drink_adapt(name, size, sweet):
if name == "奶茶":
return Coffee(sweet, size)
elif name == "咖啡":
return MilkTea(sweet, size)
else:
print("别瞎搞!")
class Drink:
def __init__(self, sweet, size):
self.name = None
self.sweet = sweet
self.size = size
if size == 0:
self.price = 8.99
elif size == 1:
self.price = 12.88
else:
self.price = 16.66
def showinfo(self):
if self.size == 0:
size = "小杯"
elif self.size == 1:
size = "中杯"
else:
size = "大杯"
print("◎您购买的饮品:%s\\n型号:%s\\n甜度:%s分糖\\n需支付的金额:%.2f元" %
(self.name, size, self.sweet, self.price))
print("-*-" * 7)
def get_price(self):
return self.price
class MilkTea(Drink):
def __init__(self, sweet, size):
Drink.__init__(self, sweet, size)
self.name = "奶茶"
self.showinfo()
class Coffee(Drink):
def __init__(self, sweet, size):
Drink.__init__(self, sweet, size)
self.name = "咖啡"
self.showinfo()
class Customer:
def __init__(self):
self.weight = input("请输入要购买橘子的重量(kg):\\n")
self.flag = input("请选择是否购买饮品?\\n0:否,1:购买\\n")
if int(self.flag) == 1:
self.drink_name = input("请问选择哪种饮品?\\n咖啡/奶茶\\n")
self.drink_size = input("请问选择哪种大小的杯子?\\n0:小,1:中,2:大\\n")
self.drink_sweet = input("请输入该饮品的甜度(0~10)\\n")
else:
self.drink_name = None
self.drink_size = 0
self.drink_sweet = 0
def request(self):
return self.weight, self.flag, self.drink_name, self.drink_size, self.drink_sweet
if __name__ == '__main__':
customer = Customer()
rqst = customer.request()
orange = Orange(float(rqst[0]), int(rqst[1]), rqst[2], int(rqst[3]), int(rqst[4]))
orange.show()
相关的测试用例:
本文关于设计模式的讲解思想,参考链接:适配器模式
往期推荐: 点这里->Python:水果与设计模式-原型模式
往期推荐: 点这里->Python:水果与设计模式-建造者模式
往期推荐: 点这里->Python:水果与设计模式-单例模式
往期推荐: 点这里->Python:水果与设计模式-抽象工厂模式
往期推荐: 点这里->Python:水果与设计模式-工厂模式
以上是关于python:水果与设计模式-适配器模式的主要内容,如果未能解决你的问题,请参考以下文章