ITPub博客

首页 > 数据库 > 数据库开发技术 > python 面向对象设计模式实践篇(11)-结构型:装饰模式实践

python 面向对象设计模式实践篇(11)-结构型:装饰模式实践

原创 数据库开发技术 作者:程序员小钟同学 时间:2021-03-25 15:14:39 0 删除 编辑

结构型模式概述

定义:前篇初期中,我们讲过结构型模式主要解决的问题是:

  • 处理实体之间的关系,使得这些实体能够更好地协同工作
  • 结构型模式是类和对象的综合体

它具有的特性:

  • 1:设计过程注重通过组合获得更强大功能的对象和类的结构
  • 2:简化结构并识别类和对象之间的关系
  • 3:主要关注类的继承和组合
  • 4:通过类和对象的模式的

装饰模式(不是装饰器模式)


所属分类

  • 结构型模式

意图

  • 动态的给一个对象添加一些额外职责。
  • 其实和我们之前的装饰器类似(但不是装饰器的模式,当然也可以通过装饰器的形式添加):向一个现有的对象添加新的功能,同时又不改变其结构

适用场景

  • 当不能采用生成子类的方法进行扩充时。

  • 1:一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。

  • 2:另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

设计原则


    1. 多组合,少继承。

    2. 类应设计的对扩展开放,对修改关闭。

    实践

    扩展功能的方法:

    • 通过传递引用的方式实现:
    class NiuRou():
       def getname(self):
           return '牛肉'


    class MakeHongshaoniurou():

       def __init__(self,rou):
           self.rou = rou

       def getname(self):
           return "红烧加工一下(附加额外的功能):" + self.rou.getname()


    print(NiuRou().getname())
    print(MakeHongshaoniurou(NiuRou()).getname())

    • 通过继承的方式实现:
    class NiuRou():
        def getname(self):
            return '牛肉'


    class MakeHongshaoniurou(NiuRou):



        def getname(self):
            return "红烧加工一下(附加额外的功能):" + super(MakeHongshaoniurou,self).getname()


    print(NiuRou().getname())
    print(MakeHongshaoniurou().getname())

    上述的方式需要额外新增相关的类来实现:

    同步组合装饰器模式来附加更多额外的:

    对牛肉的各自蹂躏!


    class NiuRou():
        def getname(self):
            return '牛肉'


    from abc import ABCMeta, abstractmethod


    class MakeType(metaclass=ABCMeta):

        def __init__(self, niurong):
            self.niurong = niurong

        @abstractmethod
        def getname(self): pass


    class Hongshao(MakeType):

        def typeaction(self):
            return "红烧加工:"

        def getname(self):
            return self.typeaction() + self.niurong.getname()


    class Shuizhu(MakeType):

        def typeaction(self):
            return "水煮加工:"

        def getname(self):
            return self.typeaction() + self.niurong.getname()


    class Ganguo(MakeType):

        def typeaction(self):
            return "干锅加工:"

        def getname(self):
            return self.typeaction() + self.niurong.getname()


    # 第一种--只是红烧一下我们的牛肉
    a = Hongshao(NiuRou())
    print(a.getname())

    # 第2种-干锅之后,再红烧一下
    b = Hongshao(Ganguo(NiuRou()))
    print(b.getname())
    # 第3种-干锅之后,再红烧一下-再水煮
    c = Shuizhu(Hongshao(Ganguo(NiuRou())))
    print(c.getname())
    # 第4种-干锅之后,再红烧一下-再水煮========估计不能吃了!
    c = Hongshao(Ganguo(Hongshao(Shuizhu(Hongshao(Ganguo(NiuRou()))))))
    print(c.getname())

    输出的结果为:

    红烧加工:牛肉
    红烧加工:干锅加工:牛肉
    水煮加工:红烧加工:干锅加工:牛肉
    红烧加工:干锅加工:红烧加工:水煮加工:红烧加工:干锅加工:牛肉

    从上面看得出,我们保持我们的NiuRou不变的情况,新增了各自独立的烹饪手法后,还可以对各种的手法进行叠加使用!:

    class NiuRou():
        def getname(self):
            return '牛肉'

    以至于到最后:估计牛肉不再是牛肉了!!!!!

    个人其他博客地址

    简书:https://www.jianshu.com/u/d6960089b087

    掘金:https://juejin.cn/user/2963939079225608

    小钟同学 | 文 【原创】| QQ:308711822

    • 1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。
    • 2:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。


    原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

    请登录后发表评论 登录
    全部评论

    注册时间:2021-02-20

    • 博文量
      224
    • 访问量
      111721