核心要点:处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。
桥接模式可以取代多层继承的方案。多层继承违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。
桥接模式极大的提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。
如上图所示,用多层继承结构可以实现,但会出现扩展性问题以及违反单一职责原则(一个类,有两个引起这个类变化的原因)
如上图 运用桥接模式
1. 创建一个品牌Brand接口,并创建两个类实现该接口
1 package com.ztq.bridge; 2 3 /*** 4 * 品牌 5 * @author ZTQ 6 * 7 */ 8 public interface Brand { 9 void sale(); 10 } 11 12 class Lenovo implements Brand{ 13 14 @Override 15 public void sale() { 16 System.out.println("销售联想电脑"); 17 } 18 19 } 20 21 class Dell implements Brand{ 22 23 @Override 24 public void sale() { 25 System.out.println("销售戴尔电脑"); 26 } 27 28 }
2. 创建机型Computer类,并创建子类
1 package com.ztq.bridge; 2 3 /*** 4 * 电脑类型的维度 5 * @author ZTQ 6 * 7 */ 8 public class Computer{ 9 protected Brand brand; 10 11 public Computer(Brand brand) { 12 this.brand = brand; 13 } 14 15 public void sale(){ 16 brand.sale(); 17 } 18 19 } 20 21 class Desktop extends Computer{ 22 23 public Desktop(Brand brand) { 24 super(brand); 25 } 26 27 public void sale(){ 28 super.sale(); 29 System.out.println("销售台式机"); 30 } 31 32 } 33 34 class Laptop extends Computer{ 35 36 public Laptop(Brand brand) { 37 super(brand); 38 } 39 40 public void sale(){ 41 super.sale(); 42 System.out.println("销售笔记本"); 43 } 44 45 }
3. 测试类Client
1 package com.ztq.bridge; 2 3 public class Client { 4 public static void main(String[] args) { 5 //销售联想笔记本 6 Computer c = new Laptop(new Lenovo()); 7 c.sale(); 8 9 //销售戴尔台式机 10 Computer c2 = new Desktop(new Dell()); 11 c2.sale(); 12 } 13 }
结果
销售联想电脑
销售笔记本
销售戴尔电脑
销售台式机
桥接模式实际开发中应用场景
——JDBC驱动程序
——AWT中的Peer架构
——银行日志管理:
格式分类:操作日志、交易日志、异常日志
距离分类:本地记录日志、异地记录日志
——人力资源系统中的奖金计算模块:
奖金分类:个人奖金、团队奖金、激励奖金
部门分类:人事部门、销售部门、研发部门
——OA系统中的消息处理:
业务类型:普通消息、加急消息、特急消息
发送消息方式:系统内消息、手机短信、邮件