模式导读:
平常我们买东西的时候可能会碰到这样的情况,比如我们想要买电脑,我们会有两种选择,购买台式电脑或者手提电脑(笔记本电脑),然后这两种电脑又会有好多种品牌的产品,比如联想,华硕,戴尔,神舟等等,所以在选择时灰常烦心。同样的让我们程序员去实现这些类之间的关系也非常麻烦,如果单纯用继承和实现的方法去表达这些类之间的关系那将是非常浩大的工程。
附上思维导图了解一下:
采用传统模式实现上图类关系时会发现无论是增加具体品牌产品类还是增加产品类型类都会增加子类的个数,违背了单一职责原则,扩展麻烦。
所以我们使用桥接模式来使产品类型类和具体品牌产品类彼此独立,中间通过像桥一样的东西将两者关联起来。
参考类图:
代码实现:
1.首先定义一个品牌接口,给它一个抽象的销售方法。
1 package com.etc; 2 3 //定义一个具体品牌产品子类的实现接口 4 public interface Brand { 5 void sale(); 6 }
2.具体的品牌产品子类
1 package com.etc; 2 //具体的品牌产品类 3 public class Lenovo implements Brand{ 4 @Override 5 public void sale() { 6 System.out.println("销售联想电脑"); 7 } 8 }
1 package com.etc; 2 //具体的品牌产品类 3 public class Dell implements Brand{ 4 @Override 5 public void sale() { 6 System.out.println("销售戴尔电脑"); 7 } 8 }
3.定义一个抽象的电脑类,里面包含对品牌类的引用,同时也给一个销售的方法。
1 package com.etc; 2 //定义抽象产品类型类 3 public abstract class Computer { 4 Brand brand; 5 //定义构造器传入品牌对象 6 public Computer(Brand brand) { 7 super(); 8 this.brand = brand; 9 } 10 public void sale() { 11 brand.sale(); 12 } 13 14 }
4.具体的电脑类型子类,继承抽象电脑类。
1 package com.etc; 2 //具体的产品类型类 -台式机电脑 3 public class Desktop extends Computer{ 4 5 public Desktop(Brand brand) { 6 super(brand); 7 } 8 public void sale() { 9 super.sale(); 10 System.out.println("-->销售台式电脑"); 11 } 12 }
1 package com.etc; 2 //具体的产品类型类 ->手提电脑 3 public class Laptop extends Computer { 4 5 public Laptop(Brand brand) { 6 super(brand); 7 } 8 public void sale() { 9 super.sale(); 10 System.out.println("-->销售手提电脑"); 11 } 12 }
5.客户端
1 package com.etc; 2 //客户端类:根据客户需要获取产品 3 public class Client { 4 public static void main(String[] args) { 5 System.out.println("售卖联想品牌的台式电脑"); 6 System.out.println("*****************"); 7 //获取具体的品牌产品 -> 联想电脑 8 Brand desktopBrand=new Lenovo(); 9 //获取台式类型的电脑 10 Computer c=new Desktop(desktopBrand); 11 c.sale(); 12 System.out.println("*****************"); 13 14 System.out.println("售卖戴尔品牌的手提电脑"); 15 System.out.println("*****************"); 16 //获取具体的品牌产品 -> 戴尔电脑 17 Brand laptopBrand=new Dell(); 18 //获取手提类型的电脑 19 Computer c2=new Laptop(laptopBrand); 20 c2.sale(); 21 System.out.println("*****************"); 22 } 23 }
效果截图:
桥接模式的优缺点:
优点:
1、抽象和实现的分离。
2、优秀的扩展能力。
3、实现细节对客户透明。
缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
适用场景:
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。