传统方案
问题
扩展性问题:(类爆炸) 如果再增加手机的样式,就需要增加各个手机品牌类的手机,同样新增一个品牌类手机,需要在各个手机样式类下增加
违反了单一职责原则,当增加手机样式的时候,要同事增加所有品牌的手机
桥接模式
介绍
桥接模式 是指:将实现与抽象放在俩个不同的类层次中,使俩个层次可以独立改变
是一种结构性设计模式
桥接模式是基于类的最小设计原则,用过使用封装、聚合和继承等相位让不用的类承担不同的职责,主要特点是把抽象和行为的实现分离开,从而可以保持各部分的独立性以及对他们的功能扩展
Clinet类:桥接模式的调用者
抽象类 Abstraction 维护了 Implementor /即是他的实现类 ConCreateImolementorA…,二者是聚合关系,Abstraction充当桥接类
RefinedAbstraction 是Abstraction抽象类的子类
Imolemetor 行为实现类的接口
ConcreteImolementorA/B 行为的具体实现类
UML图 这个的抽象类和接口是聚合的关系,即是调用和被调用的关系
桥接模式案例UML
//接口
public interface Brand {
void open();
void close();
void call();
}
public class XiaoMi implements Brand {
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println(" 小米手机开机 ");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println(" 小米手机关机 ");
}
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println(" 小米手机打电话 ");
}
}
public class Vivo implements Brand {
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println(" Vivo手机开机 ");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println(" Vivo手机关机 ");
}
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println(" Vivo手机打电话 ");
}
}
public abstract class Phone {
//组合品牌
private Brand brand;
//构造器
public Phone(Brand brand) {
super();
this.brand = brand;
}
protected void open() {
this.brand.open();
}
protected void close() {
brand.close();
}
protected void call() {
brand.call();
}
}
//折叠式手机类,继承 抽象类 Phone
public class FoldedPhone extends Phone {
//构造器
public FoldedPhone(Brand brand) {
super(brand);
}
public void open() {
super.open();
System.out.println(" 折叠样式手机 ");
}
public void close() {
super.close();
System.out.println(" 折叠样式手机 ");
}
public void call() {
super.call();
System.out.println(" 折叠样式手机 ");
}
}
public class UpRightPhone extends Phone {
//构造器
public UpRightPhone(Brand brand) {
super(brand);
}
public void open() {
super.open();
System.out.println(" 直立样式手机 ");
}
public void close() {
super.close();
System.out.println(" 直立样式手机 ");
}
public void call() {
super.call();
System.out.println(" 直立样式手机 ");
}
}
public static void main(String[] args) {
//获取折叠式手机 (样式 + 品牌 )
Phone phone1 = new FoldedPhone(new XiaoMi());
phone1.open();
phone1.call();
phone1.close();
System.out.println("=======================");
}
A+B 确定一个具体的类 可以使用桥接模式
注意事项
- 实现了抽象和显示部分的分离,提供了很大灵活性,让抽象部分和实现部分独立开,有利于系统的分层设计。
- 对于系统的高层部分,只需要知道抽象部分和实体部分接口就可以了,其他部分由具体业务来完成
- 桥接模式替代多层继承方案,可以减少子类个数,降低系统的管理 和维护成本
缺点:
增加了系统的理解和设计难度,聚合的关联关系建立在抽象层
要求正确识别出系统的俩个独立变化的维度,因此其适用范围有一定的局限性,
使用场景举例
银行转账:
转账分类:网上转账,柜台转账,ATM转账
转账用户类型:普通用户,银卡用户,金卡用户
消息管理:
消息类型:即时消息,延迟消息
消息分类:手机短信,邮件消息,QQ消息