在這裏,結構型模式包括:
適配器模式、橋接模式、組合模式、修飾器模式、外觀模式、享元模式、代理模式。
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('我是一名清華大學的學生,想申請哥倫比亞大學的博士生...')