介绍

  1. 桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。
  2. Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展

案例

手机的不同品牌和同一品牌的不同样式

原来方案
image-20200930105814116.png
缺点:如果需要增加一个手机样式,如旋转式手机,则需要增加(华为,小米,vivo等)具体手机类,如果样式很多,则出现类爆炸的情况.

解决方法:在中间加一个品牌管理所有手机,具体样式调用的是抽象的品牌image-20200930110645718.png
代码具体实现
image-20200930110817376.png

  1. //手机品牌接口和手机品牌实现类,每个手机都有开机,关机,打电话的功能
  2. public interface Brand {
  3. void open();
  4. void close();
  5. void call();
  6. }
  7. //华为品牌
  8. public class HuaWei implements Brand{
  9. @Override
  10. public void open() {
  11. System.out.println("华为手机开机了");
  12. }
  13. @Override
  14. public void close() {
  15. System.out.println("华为手机关机了");
  16. }
  17. @Override
  18. public void call() {
  19. System.out.println("华为手机打电话");
  20. }
  21. }
  22. //vivo品牌
  23. public class Vivo implements Brand{
  24. @Override
  25. public void open() {
  26. System.out.println("vivo手机开机了");
  27. }
  28. @Override
  29. public void close() {
  30. System.out.println("vivo手机关机了");
  31. }
  32. @Override
  33. public void call() {
  34. System.out.println("vivo手机打电话");
  35. }
  36. }
  1. //手机抽象类,需要传进一个品牌属性,确定手机品牌
  2. public abstract class Phone {
  3. Brand brand;
  4. public Phone(Brand brand) {
  5. this.brand = brand;
  6. }
  7. }
  8. //直板手机
  9. public class UpRightPhone extends Phone{
  10. public UpRightPhone(Brand brand) {
  11. super(brand);
  12. }
  13. public void phoneClose(){
  14. System.out.println("这是直立手机");
  15. brand.close();
  16. }
  17. public void phoneOpen(){
  18. System.out.println("这是直立手机");
  19. brand.open();
  20. }
  21. public void phoneCall(){
  22. System.out.println("这是直立手机");
  23. brand.call();
  24. }
  25. }
  26. //折叠手机
  27. public class FoldingPhone extends Phone{
  28. public FoldingPhone(Brand brand) {
  29. super(brand);
  30. }
  31. public void phoneClose(){
  32. System.out.println("这是折叠手机");
  33. brand.close();
  34. }
  35. public void phoneOpen(){
  36. System.out.println("这是折叠手机");
  37. brand.open();
  38. }
  39. public void phoneCall(){
  40. System.out.println("这是折叠手机");
  41. brand.call();
  42. }
  43. }
  1. //测试
  2. public class Client {
  3. public static void main(String[] args) {
  4. FoldingPhone phone1 = new FoldingPhone(new HuaWei());
  5. phone1.phoneOpen();
  6. phone1.phoneCall();
  7. phone1.phoneClose();
  8. System.out.println("------------------------------------------------");
  9. FoldingPhone phone2 = new FoldingPhone(new Vivo());
  10. phone2.phoneOpen();
  11. phone2.phoneCall();
  12. phone2.phoneClose();
  13. }
  14. }

image-20200930115308475.png

桥接模式的注意事项和细节

  1. 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。
  2. 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。
  3. 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
  4. 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
  5. 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景。

个人总结
当有两种事物都有多种形式,如手机样式(折叠式,直立式等)和手机品牌(小米,华为等),先把手机样式和手机品牌做成抽象类(或接口),此例中手机样式依赖品牌,所以在手机样式中聚合手机品牌;实现的功能交给实现的子类

桥接模式其它应用场景

  1. 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用.
  2. 常见的应用场景:

-JDBC驱动程序

-银行转账系统

转账分类: 网上转账,柜台转账,AMT转账

转账用户类型:普通用户,银卡用户,金卡用户..

-消息管理

消息类型:即时消息,延时消息

消息分类:手机短信,邮件消息,QQ消息…