23種設計模式python實現(2-結構型模式 )

在這裏,結構型模式包括:
適配器模式、橋接模式、組合模式、修飾器模式、外觀模式、享元模式、代理模式。

1 適配器模式

作用:接口的適配
場景:手機充電,我們國家民用電是交流22V,而手機充電時弱電直流5V。需要手機適配器,將220V交流電接口轉換爲5V直流電接口。
python實現:
建立220V交流電的類:

class AC220V:
    # s輸出220V交流電
    def out(self):
        print("220V交流電...")

建立5V直流電的類:

class DC5V(metaclass=ABCMeta):

    # 輸出5V直流電
    @abstractmethod
    def out(self):
        print('5V直流電...')

適配器類Adapter的實現

class Adapter(DC5V):
    def out(self):
        print('適配器輸入:')
        # 實例220V交流電
        ac220v = AC220V()
        ac220v.out()

        print('適配器輸出:')
        super(Adapter, self).out()

2 橋接模式

作用:分離抽象與實現
需求場景:打開燈照亮,進入辦公室、回家都需要開燈;
Python實現:
先定義一個抽象的燈:

class Light(metaclass=ABCMeta):

    @abstractmethod
    def turn_on(self):
        pass

    @abstractmethod
    def turn_off(self):
        pass

定義辦公室的燈:

class OfficeLight(Light):
    def turn_on(self):
        print('打開辦公室的燈:')
        pass

    def turn_off(self):
        print('關閉辦公室的燈:')
        pass

定義回家的燈:

class FamilyLight(Light):
    def turn_on(self):
        print('打開家裏的燈:')
        pass

    def turn_off(self):
        print('關閉家裏的燈:')
        pass

定義回家停電手電筒的燈:

class FlashLight(Light):
    def turn_on(self):
        print('打開家裏的燈:')
        pass

    def turn_off(self):
        print('關閉家裏的燈:')
        pass

定義一個橋接器的類,可以打開不同的燈:

class Bridge:
    light = None

    def turn_on_flash_light(self):
        self.light = FlashLight()
        self.light.turn_on()

    def turn_on_family_light(self):
        self.light = FamilyLight()
        self.light.turn_on()

    def turn_on_office_light(self):
        self.light = OfficeLight()
        self.light.turn_on()

3 組合模式

作用:整體-部分 樹形結構來組合對象
需求場景:公司的組織架構,公司從上到下,每一個員工又包含管理多個員工
Python實現:
定義員工的類:

class Employee:
    name = None  # 姓名
    position = None  # 職位
    level = None  # 級別
    subordinates = []  # 管理的員工數

    def add_employee(self, employee):
        self.subordinates.append(employee)

    def remove_employee(self, employee):
        self.subordinates.remove(employee)

    def get_subordinates(self):
        return self.subordinates

    def set_name(self, name):
        self.name = name

    def get_name(self):
        return self.name

    def set_position(self, position):
        self.position = position

    def get_position(self):
        return self.position

    def set_level(self, level):
        self.level = level

    def get_level(self):
        return self.level

定義組合類,實現員工的創建和遍歷:

class Composite:

    def create(self):
        ceo = Employee()
        ceo.set_name('劉備')
        ceo.set_position('祖公')
        ceo.set_level(1)

        general_1 = Employee()
        general_1.set_name('關羽')
        general_1.set_position('將軍')
        general_1.set_level(2)
        ceo.add_employee(general_1)

        general_2 = Employee()
        general_2.set_name('張飛')
        general_2.set_position('將軍')
        general_2.set_level(2)
        ceo.add_employee(general_2)

        soldier_1 = Employee()
        soldier_1.set_name('李思')
        soldier_1.set_position('士兵')
        soldier_1.set_level(3)
        general_1.add_employee(soldier_1)

        soldier_2 = Employee()
        soldier_2.set_name('王武')
        soldier_2.set_position('士兵')
        soldier_2.set_level(3)
        general_2.add_employee(soldier_2)
        return ceo

    def out(ceo):
        # 對象中list包含下一級list的訪問
        print('公司的所有的員工:')
        print(ceo.get_name(), end=" ")
        print(ceo.get_position(), end=" ")
        print(ceo.get_level())
        general_len = len(ceo.get_subordinates())

        for i in range(general_len):
            manager = ceo.get_subordinates().__getitem__(i)
            print(manager.get_name(), end=" ")
            print(manager.get_position(), end=" ")
            print(manager.get_level())

4 修飾器模式

作用:擴展對象的功能
需求場景:軟件產品界面剛開始需要一個按鈕,實現基本功能就行;後來用戶量上來了,需要部分界面的按鈕顏色和樣式美化一下。基於原來的按鈕,擴展兩個屬性
Python實現:
定義按鈕的類:

class Button:
    def __init__(self):
        self.name = 'ok'

定義一個裝飾後的按鈕:

class DecoratorButton:

    def __init__(self):
        self.button = Button()
        self.color = ''
        self.style = ''

可以測試擴展後按鈕的屬性:

    decorator_button = DecoratorButton()
    decorator_button.color = '黃色'
    decorator_button.style = '圓角'

    print('按鈕的原有屬性:')
    print("名稱 ", decorator_button.button.name)

    print('按鈕的擴展屬性:')
    print("顏色 ", decorator_button.color)
    print("樣式 ", decorator_button.style)

5 外觀模式

作用:所有的功能提供統一對外接口
需求場景:人的嘴可以看做個體人對外的接口,負責呼吸、喫飯、說話。,
Python實現:
定義呼吸系統的類:

class HealthSystem:
    def health(self):
        print('呼吸...')

定義喫飯系統的類:

class EatSystem:
    def eat(self):
        print('喫飯...')

定義說話系統的類:

class SpeakSystem:
    def speak(self):
        print('說話...')

定義一個人,實現統一對外的接口:

class Person:

    def eat(self):
        eat_system = EatSystem()
        eat_system.eat()

    def speak(self):
        speak_system = SpeakSystem()
        speak_system.speak()

    def health(self):
        health_system = HealthSystem()
        health_system.health()

6 享元模式

作用:一個標識碼對應一個對象,減少內存使用
需求場景:一個公司只有一個CEO,在多個公司舉行論壇等活動登記時,可通過CEO的管理實現公司的管理。
Python實現:
定義CEO的類:

class CEO:
    name = None
    year = None
    sex = None
    company_name = None

    def set_name(self, name):
        self.name = name

    def get_name(self):
        return self.name

    def set_year(self, year):
        self.year = year

    def get_year(self):
        return self.year

    def set_sex(self, sex):
        self.sex = sex

    def get_sex(self):
        return self.sex

    def set_company_name(self, company_name):
        self.company_name = company_name

    def get_company_name(self):
        return self.company_name

定義CEO管理的類:

class CEOFactory:
    pool = dict()

    # 通過公司名稱獲取CEO
    @classmethod
    def __get_ceo__(cls, company_name):
        ceo = cls.pool.get(company_name)
        if not ceo:
            ceo = CEO.CEO()
            cls.pool.__setitem__(company_name, ceo)
            ceo.set_company_name(company_name)

        return ceo

實現CEO管理的測試:

    ceo = CEOFactory.__get_ceo__('google')
    ceo.name = '桑達爾·皮查伊(Sundar Pichai)'
    print('公司的名稱:')
    print(CEOFactory.__get_ceo__('google').company_name)
    print('公司的CEO:')
    print(CEOFactory.__get_ceo__('google').name)

7 代理模式

作用:將複雜的或受保護的業務進行封裝,提供統一的對外接口
需求場景:學生申請國外的留學生,辦理出國手續,不知道需要哪些材料,如何辦理?找到出國代理幫忙辦理
Python實現:
定義出國代理的類:

class AbroadAgent:
    def student_abroad(self):
        print("代理:學生出國手續已辦好...")

    def travel_abroad(self):
        print("代理:旅遊出國手續已辦好...")

    def work_abroad(self):
        print("代理:外派工作出國手續已辦好...")

定義一個想申請出國留學的學生:

class Person:

    def abroad(self):
        abroad_agent = AbroadAgent()
        abroad_agent.student_abroad()

    # 顯示個人的身份
    def show_identity(self):
        print('我是一名清華大學的學生,想申請哥倫比亞大學的博士生...')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章