zoukankan      html  css  js  c++  java
  • 设计模式学习(六)装饰器模式

    一、使用背景【动机】

      当我们错误的使用继承来进行功能扩展时,在需求不断变更的同时可能会增加很多子类,且缺乏灵活性,那么这个时候我们可以考虑使用装饰器模式进行重构。

    二、引入问题

      举个栗子:我们需要做一个画图的接口

    • 第一次需求已经实现了画图的基本功能,且分别拥有了两个子类实现“圆形”和“长方形”。
    • 第二次需求需要加入上色的扩展功能,比如需要分别给第一次需求的两个子类都加入上色的功能。

      那么我们如果直接修改原来的子类实现,显然是不合适的,颜色有很多种,那么就会加入很多不同的子类【比如“红色圆形”,“绿色长方形”,“黄色长方形”等等....】,且这也违背了我们面向对象的开闭原则。

    三、代码演示

    业务接口

    业务实现类

     

    装饰器【定义主线功能】

    子装饰器【实现主线功能,并扩展分支功能】

    模式应用

    四、模式讲解

      解析:动态(组合)地给一个相对稳定的主体去增加一些拓展功能。【运行时动态拓展

      目的:就拓展功能而言,使用装饰器模式比使用继承方式拓展更为灵活。(1、消除重复代码 2、有效减少子类个数)

      特征:

    • 继承上is-a关系,即我们的装饰器实现或继承了业务接口。
    • 实现上 has-a组合关系,在装饰器内部又有一个类型为业务接口类型的全局变量。
  • 相关阅读:
    Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
    Python2.x与Python3.x的区别
    oracle锁机制
    传统解析xml的方式
    利用jdbc连接oracle数据库
    XML的解析方式(DOM、SAX、StAX)
    软件或jar包等名字里的GA意思
    windows下nginx的安装及使用
    是时候选择一款富文本编辑器了(wangEditor)
    Golang代码实现HTTPs(HTTPS证书生成和部署)
  • 原文地址:https://www.cnblogs.com/riches/p/14431558.html
Copyright © 2011-2022 走看看