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('我是一名清华大学的学生,想申请哥伦比亚大学的博士生...')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值