桥接模式
2016-07-28 22:05
344 查看
桥接模式的要点:处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。
首先看一个常见的例子:
未使用桥接模式的类图如下:
实现的代码如下:
可以发现,这种类之间的关系的设计是存在扩展性问题的,如果要增加一个新的电脑类型–智能手机,则要增加各个品牌下面的类;如果要增加一个新的品牌,也要增加各种电脑类型的类。
这种设计违反了单一职责原则:一个类,却有两个引起该类变化的原因。
如果遇到了有两种或者两种以上变化维度的场景,适合使用桥接模式,将各个维度连接起来。
上面的例子使用桥接模式的类图如下,我们可以将Computer类作为不同类型电脑的一个维度;创建一个Brand类,作为不同品牌的一个维度,最后将这两个维度的类通过组合方式桥接到一起:
实现类图的代码如下:
桥接模式总结:
桥接模式可以取代多层继承的方案。多层继承违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。
桥接模式极大地提高了系统的可扩展性,在两个变化维度中任意扩展一个维度都不需要修改原有的系统,符合开闭原则。
首先看一个常见的例子:
未使用桥接模式的类图如下:
实现的代码如下:
public interface Computer { void sale(); } class Desktop implements Computer { @Override public void sale() { System.out.println("销售台式机!"); } } class Laptop implements Computer { @Override public void sale() { System.out.println("销售笔记本!"); } } class Pad implements Computer { @Override public void sale() { System.out.println("销售平板电脑!"); } } class LenovoDesktop extends Desktop { @Override public void sale() { System.out.println("销售联想台式机"); } } class LenovoLaptop extends Laptop { @Override public void sale() { System.out.println("销售联想笔记本"); } } class LenovoPad extends Pad { @Override public void sale() { System.out.println("销售联想平板电脑"); } } class ShenzhouDesktop extends Desktop { @Override public void sale() { System.out.println("销售神舟台式机"); } } class ShenzhouLaptop extends Laptop { @Override public void sale() { System.out.println("销售神舟笔记本"); } } class ShenzhouPad extends Pad { @Override public void sale() { System.out.println("销售神舟平板电脑"); } } class DellDesktop extends Desktop { @Override public void sale() { System.out.println("销售戴尔台式机"); } } class DellLaptop extends Laptop { @Override public void sale() { System.out.println("销售戴尔笔记本"); } } class DellPad extends Pad { @Override public void sale() { System.out.println("销售戴尔平板电脑"); } }
可以发现,这种类之间的关系的设计是存在扩展性问题的,如果要增加一个新的电脑类型–智能手机,则要增加各个品牌下面的类;如果要增加一个新的品牌,也要增加各种电脑类型的类。
这种设计违反了单一职责原则:一个类,却有两个引起该类变化的原因。
如果遇到了有两种或者两种以上变化维度的场景,适合使用桥接模式,将各个维度连接起来。
上面的例子使用桥接模式的类图如下,我们可以将Computer类作为不同类型电脑的一个维度;创建一个Brand类,作为不同品牌的一个维度,最后将这两个维度的类通过组合方式桥接到一起:
实现类图的代码如下:
public class Computer2 { protected Brand brand; public Computer2(Brand b) { this.brand = b; } public void sale(){ brand.sale(); } } class Desktop2 extends Computer2 { public Desktop2(Brand b) { super(b); } @Override public void sale() { super.sale(); System.out.println("销售台式机"); } } class Laptop2 extends Computer2 { public Laptop2(Brand b) { super(b); } @Override public void sale() { super.sale(); System.out.println("销售笔记本"); } } public int 4000 erface Brand { void sale(); } class Lenovo implements Brand { @Override public void sale() { System.out.println("销售联想电脑"); } } class Dell implements Brand { @Override public void sale() { System.out.println("销售Dell电脑"); } } class Shenzhou implements Brand { @Override public void sale() { System.out.println("销售神舟电脑"); } }
桥接模式总结:
桥接模式可以取代多层继承的方案。多层继承违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。
桥接模式极大地提高了系统的可扩展性,在两个变化维度中任意扩展一个维度都不需要修改原有的系统,符合开闭原则。
相关文章推荐
- C# 设计模式系列教程-桥接模式
- 详解JavaScript设计模式开发中的桥接模式使用
- 深入解析C#设计模式中对桥接模式的具体运用
- C#桥接模式完整实例
- 深入理解JavaScript系列(44):设计模式之桥接模式详解
- 用代码和UML图化解设计模式之桥接模式的深入分析
- C++设计模式之桥接模式
- 详解JavaScript设计模式开发中的桥接模式使用
- VMware下桥接设置
- GOF23之桥接模式Demo
- 设计模式-----桥接模式(Bridge Pattern)
- CentOs6.5下的网络配置
- ubuntu12.04网络配置——桥接方式配置静态IP
- VMware下桥接设置
- 第二天,VMware三种网络模式的简单区别
- Vmware-桥接模式连接网络
- 23种设计模式全解析
- 大话设计模式 桥接模式
- 虚拟机的三种网络连接方式
- Linux平台使用桥接模式运行xp