浅谈设计模式之桥接模式
2016-05-26 15:44
281 查看
桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。要理解抽象与它的实现分离,这并不是说让抽象类与它的派生类分离,这并没有什么意义。实现指的是每个类继承体系都各自用来实现自己的对象,对于多个维度的变化各不影响。
比如,我们日常中都会使用各种品牌的手机,而每个品牌的预装软件都不尽相同。假如我们要设计各种各样的包括软硬件的手机的话,那就不可避免同时拥有各种品牌和软件,这时候无论以软件或者品牌作为父类都不合适,最恰当的方式是品牌中包含手机软件。这个就涉及到了组合/聚合的使用。
根据组合/聚合复用原则,程序中药尽量使用组合/聚合,尽量不要使用类的继承,以免系统组织的设计过于复杂。优先使用对象的组合/聚合有助于保持每个类的封装被集中在单个任务上。
聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分;组合则表示一种强的拥有关系,体现的是严*的部分与整体的关系,并且部分和整体的生命周期一样。
UML图如下:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。另外我们还需要掌控好这多个维度变化的分类,所以理解起来稍微复杂一点。
桥接模式的好处在于现在假如增加新的软件,那么也就是增加一个新的软件类并加以调用即可,而不会影响其他的类。其实这也恰好是开放-封闭原则的应用,封闭修改,开放拓展。
参考书籍:《大话设计模式》
比如,我们日常中都会使用各种品牌的手机,而每个品牌的预装软件都不尽相同。假如我们要设计各种各样的包括软硬件的手机的话,那就不可避免同时拥有各种品牌和软件,这时候无论以软件或者品牌作为父类都不合适,最恰当的方式是品牌中包含手机软件。这个就涉及到了组合/聚合的使用。
根据组合/聚合复用原则,程序中药尽量使用组合/聚合,尽量不要使用类的继承,以免系统组织的设计过于复杂。优先使用对象的组合/聚合有助于保持每个类的封装被集中在单个任务上。
聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分;组合则表示一种强的拥有关系,体现的是严*的部分与整体的关系,并且部分和整体的生命周期一样。
UML图如下:
//相当于品牌父类 class Abstratction { protected Implementor implementor; public void SetImplementor(Implementor implementor) { this.implementor = implementor; } public virtual void Operation() { implementor.Operation(); } } //相当于具体品牌 class RefinedAbstraction : Abstraction { public override void Operation() { implementor.Operation(); } } //相当于软件父类 abstract class Implementor { public abstract void Operation(); } //相当于具体运行的软件A class ConcreteImplementorA : Implementor { public override void Operation() { Print("ConcreteImplementorA"); } } //相当于具体运行的软件B class ConcreteImplementorB : Implementor { public override void Operation() { Print("ConcreteImplementorB"); } } static void Main(string[] args) { Abstraction ab = new RefinedAbstraction(); ab.SetImplementor(new ConcreteImplementorA()); ab.Operation(); ab.SetImplementor(new ConcreteImplementorB()); ab.Operation(); console.Read(); }
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。另外我们还需要掌控好这多个维度变化的分类,所以理解起来稍微复杂一点。
桥接模式的好处在于现在假如增加新的软件,那么也就是增加一个新的软件类并加以调用即可,而不会影响其他的类。其实这也恰好是开放-封闭原则的应用,封闭修改,开放拓展。
参考书籍:《大话设计模式》
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用