Python 設計模式 (一)

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章