代理模式
from abc import ABC, abstractmethod
class Buy(ABC):
@abstractmethod
def buy_ticket(self):
pass
class Man(Buy):
def buy_ticket(self):
print("Man 买票成功!")
class Woman(Buy):
def buy_ticket(self):
print("Woman 买票成功!")
class Agency(ABC):
def __init__(self, people: Buy):
self._people = people
@abstractmethod
def click_to_buy_ticket(self):
pass
class MeiTuan(Agency):
def click_to_buy_ticket(self):
print("正在通过美团进行买票...")
self._people.buy_ticket()
class XieCheng(Agency):
def click_to_buy_ticket(self):
print("正在通过携程进行买票...")
self._people.buy_ticket()
if __name__ == '__main__':
man = Man()
woman = Woman()
man.buy_ticket()
woman.buy_ticket()
meituan = MeiTuan(man)
meituan.click_to_buy_ticket()
xiecheng = XieCheng(woman)
xiecheng.click_to_buy_ticket()
装饰者模式
from abc import ABC, abstractmethod
class People(ABC):
def __init__(self):
self._wearingState = ""
@abstractmethod
def show(self):
pass
class Girl(People):
def __init__(self):
super().__init__()
self._wearing_state = "女孩穿着,长裤睡衣,长袖睡衣"
def show(self):
print(self._wearing_state)
class Boy(People):
def __init__(self):
super().__init__()
self._wearing_state = "男孩穿着,短裤睡衣,短袖睡衣"
def show(self):
print(self._wearing_state)
class ChangeClothes(ABC):
def __init__(self, people: People):
self._people = people
self._changed_state = ""
@abstractmethod
def show(self):
pass
class ChangeIntoSchoolUniform(ChangeClothes):
def __init__(self, people: People):
super().__init__(people)
self._changed_state = "但是最后换成了校服"
def show(self):
self._people.show()
print(self._changed_state)
class ChangeIntoSportswear(ChangeClothes):
def __init__(self, people: People):
super().__init__(people)
self._changed_state = "但是最后换成了运动装"
def show(self):
self._people.show()
print(self._changed_state)
if __name__ == '__main__':
boy = Boy()
boy.show()
girl = Girl()
girl.show()
boy = ChangeIntoSportswear(boy)
boy.show()
girl = ChangeIntoSportswear(girl)
girl.show()
适配器模式
对象适配器
"""
电源插座案例:三插头和两插头的适配
用户本身只有三插头
用户现在需要将三插头转换为两插头
"""
from abc import ABC, abstractmethod
class ThreePlug:
def three_plug_charge(self):
print("开始充电...")
class TwoPlugShape(ABC):
@abstractmethod
def two_plug_charge(self):
pass
class TwoPlug(TwoPlugShape):
def two_plug_charge(self):
print("开始充电...")
class PlugConverter(TwoPlugShape):
def __init__(self, obj: ThreePlug):
self._three_plug = obj
def two_plug_charge(self):
print("温馨提示:您正在使用插头转换器")
self._three_plug.three_plug_charge()
if __name__ == '__main__':
three_plug = ThreePlug()
three_plug.three_plug_charge()
two_plug = PlugConverter(three_plug)
two_plug.two_plug_charge()
类适配器
"""
电源插座案例:三插头和两插头的适配
用户本身只有三插头
用户现在需要将三插头转换为两插头
"""
from abc import ABC, abstractmethod
class ThreePlug:
def three_plug_charge(self):
print("开始充电...")
class TwoPlugShape(ABC):
@abstractmethod
def two_plug_charge(self):
pass
class TwoPlug(TwoPlugShape):
def two_plug_charge(self):
print("开始充电...")
class PlugConverter(TwoPlugShape, ThreePlug):
def two_plug_charge(self):
print("温馨提示:您正在使用插头转换器")
self.three_plug_charge()
if __name__ == '__main__':
three_plug = ThreePlug()
three_plug.three_plug_charge()
two_plug = PlugConverter()
two_plug.two_plug_charge()
桥接模式
"""
案例:生成图案
要求:颜色类和形状类进行搭配,生成图案:"红色圆形"、"蓝色圆形"、"红色矩形"、"蓝色矩形"
1. 颜色有两个:红色、蓝色
2. 形状有两个:圆形、矩形
"""
from abc import ABC, abstractmethod
class Color(ABC):
@abstractmethod
def fill_color(self):
pass
class Red(Color):
def fill_color(self):
print("填充了红色")
class Blue(Color):
def fill_color(self):
print("填充了蓝色")
class Shape(ABC):
def __init__(self):
self._color = None
def set_color(self, color: Color):
self._color = color
@abstractmethod
def _draw_shape(self):
pass
def generate(self):
self._draw_shape()
self._color.fill_color()
class Circle(Shape):
def _draw_shape(self):
print("画出了圆形 ", end="")
class Rectangle(Shape):
def _draw_shape(self):
print("画出了矩形 ", end="")
if __name__ == '__main__':
red = Red()
blue = Blue()
circle = Circle()
rectangle = Rectangle()
circle.set_color(red)
circle.generate()
circle.set_color(blue)
circle.generate()
rectangle.set_color(red)
rectangle.generate()
rectangle.set_color(blue)
rectangle.generate()
外观模式
"""
编译过程是比较复杂的,通常包含以下内容:
- 编译器在后台进行语法分析
- 生成中间代码 (预处理)
- 生成汇编代码 (编译)
- 生成机器码 (汇编)
- 生成可执行程序 (链接)
虽然如此,现实中 IDE(集成开发环境) 通常能够给我们提供一键编译的方法,方便了我们的开发
下面,我们将模拟这个过程
"""
from abc import ABC, abstractmethod
class SyntaxAnalyzer:
def syntax_parser(self):
print("分析语法中...")
class MidCode:
def generate_middle_code(self):
print("生成中间代码中...")
class AssemblyCode:
def generate_assembly_code(self):
print("生成汇编代码中...")
class BinaryCode:
def generate_binary_code(self):
print("生成机器码中...")
class Link:
def generate_program(self):
print("生成可执行程序中...")
class IDE:
def compile(self):
sa = SyntaxAnalyzer()
mc = MidCode()
ac = AssemblyCode()
bc = BinaryCode()
lk = Link()
sa.syntax_parser()
mc.generate_middle_code()
ac.generate_assembly_code()
bc.generate_binary_code()
lk.generate_program()
print("程序运行中...")
if __name__ == '__main__':
python_IDE = IDE()
python_IDE.compile()
享元模式
"""
享元模式(Flyweight Mode)
案例:用户访问多个相似的网站,这些相似的网站之间,有共享的部分,也有自己独有的部分
"""
from abc import ABC, abstractmethod
class User:
def __init__(self, username):
self._username = username
@property
def name(self):
return self._username
class AbstractWebsite(ABC):
@abstractmethod
def show_page(self, user: User):
pass
class Website(AbstractWebsite):
def __init__(self, web_name: str):
self._web_name = web_name
def show_page(self, user: User):
print(f"网站:{self._web_name} 正在为用户:{user.name} 展示页面")
class WebsiteFactory:
def __init__(self):
self._website_dict = {}
def generate_website(self, web_name: str):
if web_name not in self._website_dict:
self._website_dict[web_name] = Website(web_name)
return self._website_dict.get(web_name)
def check_website_count(self):
return len(self._website_dict)
if __name__ == '__main__':
web_factory = WebsiteFactory()
web_1 = web_factory.generate_website("华为官网")
web_2 = web_factory.generate_website("小米官网")
web_3 = web_factory.generate_website("腾讯官网")
user_1 = User("小明")
user_2 = User("小帅")
user_3 = User("小美")
web_1.show_page(user_1)
web_2.show_page(user_1)
web_3.show_page(user_1)
print("--------------")
web_1.show_page(user_2)
web_2.show_page(user_2)
web_3.show_page(user_2)
print("--------------")
web_1.show_page(user_3)
web_2.show_page(user_3)
web_3.show_page(user_3)
print("--------------")
组合模式
from abc import ABC, abstractmethod
"""
案例:通过组合模式,模仿并实现一个简单的目录文件系统
"""
class Container(ABC):
@abstractmethod
def get_name(self):
pass
@abstractmethod
def add(self, obj):
pass
@abstractmethod
def remove(self, obj):
pass
@abstractmethod
def get_children(self):
pass
class Directory(Container):
def __init__(self, directory_name: str):
self._directory_name = directory_name
self._children_list = []
def get_name(self):
return self._directory_name
def add(self, obj):
self._children_list.append(obj)
def remove(self, obj):
self._children_list.remove(obj)
def get_children(self):
return self._children_list
class File(Container):
def __init__(self, file_name: str):
self._file_name = file_name
self._children_list = []
def get_name(self):
return self._file_name
def add(self, obj):
pass
def remove(self, obj):
pass
def get_children(self):
return self._children_list
def show_tree(obj: Container, width: int):
i = 0
while i < width:
print("---", end="")
i += 1
print(obj.get_name())
children = obj.get_children()
if not children:
return None
for obj in children:
show_tree(obj, width + 1)
if __name__ == '__main__':
root_directory = Directory("C:")
child_directory = Directory("User")
root_directory.add(child_directory)
file_1 = File("a.txt")
file_2 = File("b.txt")
file_3 = File("c.txt")
file_4 = File("d.txt")
root_directory.add(file_1)
root_directory.add(file_2)
child_directory.add(file_3)
child_directory.add(file_4)
show_tree(root_directory, 1)
"""
运行结果:
---C:
------User
---------c.txt
---------d.txt
------a.txt
------b.txt
"""