python:水果与设计模式-建造者模式
Posted Spuer_Tiger
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python:水果与设计模式-建造者模式相关的知识,希望对你有一定的参考价值。
建造者模式(Builder Pattern) :属于创建型模式,它提供了一种创建对象的最佳方式。这种模式 使用多个简单的对象一步一步构建成一个复杂的对象,一个 Builder 类会一步一步构造最终的对象,且该 Builder类是独立于其他对象的。
意图: 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决: 主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定
。
何时使用: 一些基本部件不会变,而其组合经常变化的时候。
如何解决: 将变与不变分离开。
关键代码: 建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。
2、如内部变化复杂,会有很多的建造类。
注意事项: 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。(根据后面的实例,自行体会!!)
应用实例: 我们在生活中常常会遇到超市的水果限时促销活动,而这些促销的水果常常以便宜的价格吸引消费者的注意力,而我们的水果工厂在夏季也迎来了换季限时促销活动。
那我们一起使用建造者模式,实现一个促销水果的清单管理项目吧!(づ。◕ᴗᴗ◕。)づ
实现的思路:
- 项目的核心包括4个部分:
MenuBuilder(促销清单的建造者)负责建造参与促销的水果清单
,Menu(参与促销的水果清单)负责对促销水果的管理功能,如:增删改查等
,Item(促销水果的通用模板类)负责提供水果基础信息的抽象类
,如:重量、原价、促销价、名称等,以及Pack(包装类)负责管理水果的包装方式。 Grape(葡萄)、Citrus(柑橘)、Tangerine(冰橘)、Hami_Melon(哈密瓜)是基于Item抽象类的具体实现
,此外,他们均使用Pack类里面的pack方式
。
项目的UML用例图如下:
实现的代码如下:
class Item:
# Item类提供水果的基础信息的抽象类
def set_name(self):
pass
def packing(self):
pass
def set_price(self):
pass
def set_weight(self):
pass
def promotion_price(self):
pass
class Pack:
# Pack管理水果的包装方式
def pack(self):
pass
class box_pack(Pack):
# box-pack采用盒装方式
def pack(self):
return "盒装"
class bag_pack(Pack):
# bag-pack采用袋装方式
def pack(self):
return "袋装"
class Grape(Item):
# 葡萄类
def packing(self):
wrap = box_pack()
return wrap
def set_price(self):
grape_price = 18.0
return grape_price
def set_name(self):
grape_name = "葡萄"
return grape_name
def set_weight(self):
grape_weight = 2.5
return grape_weight
def promotion_price(self):
return 28.99
class Hami_Melon(Item):
# 哈密瓜类
def packing(self):
wrap = bag_pack()
return wrap
def set_price(self):
hami_melon_price = 22.0
return hami_melon_price
def set_name(self):
hami_melon_name = "哈密瓜"
return hami_melon_name
def set_weight(self):
hami_melon_weight = 3.2
return hami_melon_weight
def promotion_price(self):
return 39.99
class Orange(Item):
# 橘子大类
def packing(self):
wrap = bag_pack()
return wrap
def set_price(self):
pass
class Citrus(Orange):
# 柑橘类
def set_price(self):
citrus_price = 12.5
return citrus_price
def set_name(self):
citrus_name = "柑橘"
return citrus_name
def set_weight(self):
citrus_weight = 2.6
return citrus_weight
def promotion_price(self):
return 18.88
class Tangerine(Orange):
# 冰橘类
def set_price(self):
tangerine_price = 13.0
return tangerine_price
def set_name(self):
tangerine_name = "冰橘"
return tangerine_name
def set_weight(self):
citrus_weight = 3.3
return citrus_weight
def promotion_price(self):
return 26.66
class Menu:
def __init__(self):
self.items = []
def AddItem(self, item):
# 添加item,即添加参与促销活动的水果
self.items.append(item)
def ShowItems(self):
# ShowItem,展示参与促销活动的水果清单
print("-*-" * 5 + "限时促销清单" + "-*-" * 10)
for item in self.items:
print("◎Item:" + item.set_name() + " 包装:" + item.packing().pack() + " 原价:" + str(
item.set_price()) + "元/千克" + " 重量:" + str(item.set_weight()) + "千克" + "\\n 限时促销价:" +
str(item.promotion_price()) + "元!!!")
print("-*-" * 5 + "限时促销清单" + "-*-" * 10)
class MenuBuilder:
@staticmethod
def PrepareMenu():
# 构造清单,过程如下:
menu = Menu()
menu.AddItem(Grape())
menu.AddItem(Citrus())
menu.AddItem(Tangerine())
menu.AddItem(Hami_Melon())
return menu
if __name__ == '__main__':
# 新建一个建造者
menu_builder = MenuBuilder()
# 建造促销活动的水果清单
menu_object = menu_builder.PrepareMenu()
# 展示参与促销活动的水果信息
menu_object.ShowItems()
相关的测试用例:
本文关于设计模式的讲解思想,参考链接:建造者模式
关于@staticmethod的用法,参考链接:@staticmethod和@classmethod的用法
往期推荐: 点这里->Python:水果与设计模式-单例模式
往期推荐: 点这里->Python:水果与设计模式-抽象工厂模式
往期推荐: 点这里->Python:水果与设计模式-工厂模式
以上是关于python:水果与设计模式-建造者模式的主要内容,如果未能解决你的问题,请参考以下文章