`

设计模式笔记心得(2)--Bridge模式,Decorator模式

阅读更多
Bridge模式
Bridge的核心就是将抽象和实现分离, 让二者独立变化
当需要将类的行为和属性分离的时候,可以采用Bridge模式, 在抽象体实现属性, 在实现体实现行为, 从而达到属性和行为能独立变化, 他们之间通过桥接(也就是将二者绑定, 在抽象类中隐藏)的方式来进行关联, 而且这种桥接绑定的关系是可动态改变的, 这也是与继承相比最大的优点, 有时候我们也可以将其理解为代理模式的一种演化, 将行为代理给各个不同的行为实现类来处理.
该模式在行为和属性存在交叉重合的场景下非常有用, 比如网上那个coffee的例子可谓bridge模式的经典例子, coffee有两种属性:大杯和中杯, 同时有两种行为:加奶和不加奶, 这样属性和行为可以交叉组合而得到不同的coffee.

Bridge模式是使用组合而非继承的典型模式

Decorator模式
装饰器模式的两个要点:
1.装饰器类必须继承被装饰类;
2.装饰器类必须持有被装饰类实例;
采用Wrapper模式的说法可能更形象一些, 实际上就是在具体类的基础上一层层添加所需要的功能, 将被装饰的对象采用不同的装饰类层层包裹起来, 同Bridge模式一样, 他也采用组合的方式来将某个功能添加到抽象类之上, 当需要将各种装饰效果进行组合的时候可以避免生成多个抽象类的子类.

为何采用Decorator而不是普通的继承?
一般通过继承来扩展一个功能, 最简单的就是对要扩展的方法进行复写, 另一个就是添加抽象方法交给子类自己去实现, 功能越多,添加的抽象方法就越多, 而这些方法都是静态的, 一旦要派生具体子类就必须实现(或者空实现) , 而这些抽象方法的调用方式也是固定的(除非复写再改写), 这样显然是不够灵活的做法, 而且如果存在多种功能的组合会导致派生的子类成几何数增长, 当出现这种情况时我们就不应该使用简单的继承,而应该进行重构使用其他的设计模式来更好的满足我们的需求.

Decorator和Bridge的区别
Decorator是对已有功能的增强, 装饰类都是围绕被装饰类已有的功能而展开的, 无论装饰类怎么变, 它都必须围绕被装饰类来变化(或者是围绕二者公共的接口来变化), 因为对于客户程序来说, 调用装饰前后的对象应该是一致的. 而Bridge模式是将行为从被桥接对象(抽象类)中分离出去, 完全放到实现类中去实现, 行为实现将更少的受到被桥接对象的限制. 所以如果这种约束是必要的,就可以采用Decorator模式, 反之则可以采用Bridge模式

注意事项
Decorator, Bridge采用的是组合模式, 不可避免的需要创建一些类实例, 相对于继承来说内存消耗要相对大一些, 比如使用Decorator除了需要new装饰器类实例还需要new被装饰类, 因此出于效率的考虑new出来的对象应该尽可能的小, 也就是要做到new的对象类必须职责单一, 按需来new对象, 对于Decorator来说, 抽象对象的实现应该尽可能的简单, 将复杂的东东放到装饰类中实现, 而Bridge则要将不同的职责封装到行为实现中
分享到:
评论

相关推荐

    C#设计模式-吕震宇

    设计模式(16)-Bridge Pattern 设计模式(15)-Facade Pattern 设计模式(14)-Flyweight Pattern C#设计模式(13)-Proxy Pattern C#设计模式(12)-Decorator Pattern C#设计模式(11)-Composite Pattern ...

    java版本二十三种设计模式.zip

    - 23种设计模式 - 工厂方法模式(Factory Method) - 抽象工厂模式(Abstract Factory) - 单例模式(Singleton) - 建造者模式(Builder) - 原型模式(Prototype) - 代理模式(Proxy) - 适配器模式(Adapter) - 装饰...

    vue脚手架,vue3 组件 vue-property-decorator 组件

    vue脚手架 本框架已开发了所属相关组件,如有 定制组件 需求可联系

    设计模式之 Decorator模式和代码实现

    奇幻RPG(物品锻造 与 Decorator模式)本文中,我们通过一个常见的给武器(对象)添加宝石(额外的状态和行为)的例子,讨论了Decorator设计模式的实现过程。

    C#设计模式.PDF

    C#设计模式(2) 11 一、 "开放-封闭"原则(OCP) 12 二、 里氏代换原则(LSP) 12 C#设计模式(3) 19 三、 依赖倒置原则(DIP) 19 四、 接口隔离原则(ISP) 20 五、 合成/聚合复用原则(CARP) 21 六、 迪米特法则...

    python3-timeout-decorator-0.4.1-2.el8.noarch.rpm

    官方离线安装包,亲测可用

    C#设计模式大全

    C#设计模式(2) 一、 "开放-封闭"原则(OCP) 二、 里氏代换原则(LSP) C#设计模式(3) 三、 依赖倒置原则(DIP) 四、 接口隔离原则(ISP) 五、 合成/聚合复用原则(CARP) 六、 迪米特法则(LoD) C#设计...

    设计模式精解-GoF 23种设计模式解析

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码 目 录 引 言 0.1 设计模式解析(总序) 0.2 设计模式解析后记 0.3 与作者联系 1 创建型模式 1.1 Factory模式 1.2 AbstactFactory模式 1.3 Singleton...

    36种最新设计模式整理

    36种最新设计模式整理 Design Pattern: Simple Factory 模式 Design Pattern: Abstract Factory 模式 Design Pattern: Builder 模式 Design Pattern: Factory Method 模式 Design Pattern: Prototype 模式 ...

    decorator-4.2.1-py2.py3-none-any.whl

    decorator-4.2.1-py2.py3-none-any.whl

    精心整理的23种python设计模式代码

    代码都可以直接运行,部分设计模式有多种实现,主要的设计模式如下:Creational-abstract_factory,Creational-factory_method,Creational-simple_factory,Creational-singleton,Creational-builder,Creational-...

    设计模式之Decorator

    博文链接:https://your.iteye.com/blog/133420

    python-decorator-3.4.0-3.el7.noarch.rpm

    离线安装包,亲测可用

    设计模式--C++

    1.1 什么是设计模式 2 1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...

    JAVA设计模式chm文档

    设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之...

    C#设计模式之Decorator 装饰模式

    C#设计模式之Decorator 装饰模式,pdf+视频教学,实例演示,易学易用~~

    eslint-plugin-decorator-position:用于强制装饰器位置的ESLint插件

    安装插件yarn add --dev eslint-plugin-decorator-position 要么npm install --save-dev eslint-plugin-decorator-position2.修改.eslintrc.js // .eslintrc.jsmodule . exports = { parser : 'babel-eslint' , // ...

    设计模式C++代码示例-含VC工程

    C++设计模式代码: (VC工程) Creational Patterns Abstract Factory Creates an instance of several families of classes Builder Separates object construction from its representation Factory Method ...

    前端开源库-pure-render-decorator

    前端开源库-pure-render-decorator纯渲染装饰,使反应组件纯。

Global site tag (gtag.js) - Google Analytics