设计模式之桥接模式bridge
场景
商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售的问题?
这个场景中有两个变化维度:电脑类型、电脑品牌
多层继承结构实现问题
- 扩展性问题(个数膨胀问题)
- 如果要增加一个新的电脑类型智能手机,则要增加各个品牌下面的类
- 如果要增加一个新的品牌,也要增加各种电脑类型的类
- 违反单一职责原则
- 一个类:联想笔记本,有两个引起这个类变化的原因
代码示例
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("销售戴尔平板"); } }
桥接模式核心
处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联
代码
品牌类
public interface Brand { void sale(); } class Lenovo implements Brand{ @Override public void sale() { System.out.println("销售联想电脑"); } } class Shenzhou implements Brand{ @Override public void sale() { System.out.println("销售神州电脑"); } } class Dell implements Brand{ @Override public void sale() { System.out.println("销售戴尔电脑"); } }
客户端
public class Client { public static void main(String[] args){ //用组合的方式增加品牌 Computer2 computer2 = new Laptop2(new Lenovo()); computer2.sale(); Computer2 computer21 =new Laptop2(new Dell()); computer21.sale(); //增加台式机 Computer2 computer22 = new Desktop2(new Lenovo()); Computer2 computer23 = new Desktop2(new Dell()); } }
场景
银行日志管理
- 格式分类:操作日志、交易日志、异常日志
- 距离分类:本地记录日志、异地记录日志
人类资源系统的奖金计算模块
- 奖金分类:个人奖金、团体奖金、激励奖金
- 部门分类:人事部门、销售部门、研发部门
OA系统中的消息处理
- 业务类型:普通消息、加急消息、特急消息
- 发送消息方式:系统内消息、手机短信、邮件