Python 設計模式 (一)
01 工廠模式
https://blog.csdn.net/sunt2018/article/details/84786264
https://blog.csdn.net/sunt2018/article/details/84786476
02 建造者模式
https://blog.csdn.net/sunt2018/article/details/84786624
03 原型模式
原型模式的目的是克隆對象 或者 副本
類似於淺拷貝和深拷貝
淺拷貝就是 副本依賴引用
深拷貝就是 完全克隆一份
https://blog.csdn.net/sunt2018/article/details/84789114
04 適配器模式
將一個類的接口轉換成爲客戶希望的另外一個接口
使得原本由於接口不兼容而不能一起工作的那些類可以一起工作
class Target(object):
def request(self):
print("普通請求")
class Adaptee(object):
def specific_request(self):
print("特殊請求")
class Adapter(Target):
def __init__(self):
self.adaptee = Adaptee()
def request(self):
self.adaptee.specific_request()
if __name__ == "__main__":
target = Adapter()
target.request()
#-------------------------------
# Target 已有的類
target = Target()
target.request()
# 當其他調用者不兼容的時候,我們可以給他一個兼容的類
target = Adapter()
target.request()
05 裝飾器模式
學習Python的裝飾器
https://blog.csdn.net/sunt2018/article/details/85989249
裝飾器設計模式
https://blog.csdn.net/ZhangQiye1993/article/details/82348283
06 外觀模式
外觀模式包含如下角色: Facade: 外觀角色 SubSystem:子系統角色
假設有一組火警報警系統,由三個子元件構成:一個警報器,一個噴水器,一個自動撥打電話的裝置。
class AlarmSensor:
# 報警傳感器
def run(self):
print("Alarm Ring...")
class WaterSprinker:
# 噴水器
def run(self):
print("Spray Water...")
class EmergencyDialer:
#緊急撥打電話裝置
def run(self):
print("Dial 119...")
class EmergencyFacade:
"""
外觀類中封裝了對子系統的操作
"""
def __init__(self):
self.alarm_sensor=AlarmSensor()
self.water_sprinker=WaterSprinker()
self.emergency_dialer=EmergencyDialer()
def runAll(self):
self.alarm_sensor.run()
self.water_sprinker.run()
self.emergency_dialer.run()
if __name__=="__main__":
emergency_facade=EmergencyFacade()
emergency_facade.runAll()
07 享元模式
享元模式是一種用於解決資源和性能壓力時會使用到的設計模式
它的核心思想是通過引入數據共享來提升性能
單例模式實現的是一個類對象只允許有一個實例對象
而享元模式則是一個類對象只允許創建不同類型的對象
import random
from enum import Enum
TreeType = Enum('TreeType', 'apple_tree cherry_tree peach_tree')
class Tree:
pool = dict()
def __new__(cls, tree_type):
obj = cls.pool.get(tree_type, None)
if not obj:
obj = object.__new__(cls)
cls.pool[tree_type] = obj
obj.tree_type = tree_type
return obj
def render(self, age, x, y):
print('render a tree of type {} and age {} at ({}, {})'.format(
self.tree_type, age, x, y))
def main():
rnd = random.Random()
age_min, age_max = 1, 30 # 單位爲年
min_point, max_point = 0, 100
tree_counter = 0
# apple_tree
for _ in range(10):
t1 = Tree(TreeType.apple_tree)
t1.render(rnd.randint(age_min, age_max),
rnd.randint(min_point, max_point),
rnd.randint(min_point, max_point))
tree_counter += 1
# cherry_tree
for _ in range(3):
t2 = Tree(TreeType.cherry_tree)
t2.render(rnd.randint(age_min, age_max),
rnd.randint(min_point, max_point),
rnd.randint(min_point, max_point))
tree_counter += 1
# peach_tree
for _ in range(5):
t3 = Tree(TreeType.peach_tree)
t3.render(rnd.randint(age_min, age_max),
rnd.randint(min_point, max_point),
rnd.randint(min_point, max_point))
tree_counter += 1
print('trees rendered: {}'.format(tree_counter)) # 一共循環了18次
print('trees actually created: {}'.format(len(Tree.pool))) # 3次 因爲只有3個不重複
t4 = Tree(TreeType.cherry_tree)
t5 = Tree(TreeType.cherry_tree)
t6 = Tree(TreeType.apple_tree)
print('{} == {}? {}'.format(id(t4), id(t5), id(t4) == id(t5))) # True
print('{} == {}? {}'.format(id(t5), id(t6), id(t5) == id(t6))) # False
main()
08 模型-視圖-控制器模式
這就我們常說的MVC模式
class View(object):
# 視圖
def __init__(self, controller):
self.controller = controller
def show(self):
self.controller.show()
def add(self, key, value):
self.controller.add(key, value)
def remove(self, key):
self.controller.remove(key)
class Controller(object):
# 控制器
def __init__(self, model):
self.model = model
def show(self):
for key, item in self.model.items():
print(key, item)
def add(self, key, value):
self.model[key] = value
def remove(self,key):
if key in self.model.keys():
self.model.pop(key)
class Model(dict):
# 模型
pass
if __name__ == '__main__':
# model 其實就是一個列表
model = Model(
[(0,'xiaoming'),(1,'xiaohua'),
(2, 'xiaogang'),(3,'xiaohua'),(4,'xiaoli')
])
controller = Controller(model)
view = View(controller)
view.show()
print('*'*100)
view.add(5,'laoliu')
view.show()
print('*'*100)
view.remove(0)
view.show()