0x01:桥接模式简介
桥接模式是将形象局部与它的实现局部拆散,使它们都能够独立地变动,而不会间接影响到其余局部。是一种对象结构型模式,又称接口(interface)模式。UML类图如下:
次要角色如下:
Implementor:实现化角色,它是接口或者抽象类,定义角色必须的行为和属性;这个接口不肯定要与Abstraction的接口完全一致,事实上这两个接口能够齐全不同,一般而言,Implementor接口仅提供基本操作,而Abstraction定义的接口可能会做更多更简单的操作。Implementor接口对这些基本操作进行了申明,而具体实现交给其子类。通过关联关系,Abstraction不仅领有本人的办法,还能够调用Implementor中定义的办法,应用关联关系来代替继承关系;
ConcreteImplementor:具体实现化角色,实现接口或抽象类定义的办法或属性。在不同的ConcreteImplementor中提供基本操作的不同实现,在程序运行时,ConcreteImplementor对象将替换其父类对象,提供给抽象类具体的业务操作方法;
Abstraction:抽象化角色,定义出该角色的行为,同时保留一个对实现化角色的援用;它个别是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并能够保护该对象,它与Implementor之间具备关联关系,它既能够蕴含形象业务办法,也能够蕴含具体业务办法;
RefinedAbstraction:裁减抽象类角色,援用实现化角色对抽象化角色进行裁减。通常状况下,它不再是抽象类而是具体类,它实现了在Abstraction中申明的形象业务办法,在RefinedAbstraction中能够调用在Implementor中定义的业务办法;
0x02:桥接模式典型实现
Implementor抽象类
public abstract class Implementor { public abstract void operatorA(); public abstract void operatorB(); }
ConcreteImplementor:这里能够编写多个具体实现类
public class ConcreteImplementorA extends Implementor { @Override public void operatorA() { System.out.println("具体实现ConcreteImplementorA的operatorA执行"); } @Override public void operatorB() { System.out.println("具体实现ConcreteImplementorA的operatorB执行"); }}public class ConcreteImplementorB extends Implementor { @Override public void operatorA() { System.out.println("具体实现ConcreteImplementorB的operatorA执行"); } @Override public void operatorB() { System.out.println("具体实现ConcreteImplementorB的operatorB执行"); }}
Abstraction抽象类
public abstract class Abstraction { private Implementor implementor; //束缚子类必须实现该构造函数 public Abstraction(Implementor implementor) { this.implementor = implementor; } public Implementor getImplementor() { return implementor; } //本身的行为和属性 public void request() { //TODO 能够增加操作 }}
RefinedAbstraction
public class RefinedAbstraction extends Abstraction { //覆写构造函数 public RefinedAbstraction(Implementor implementor) { super(implementor); } //修改父类行为 @Override public void request() { super.request(); super.getImplementor().operatorA(); }}
桥接模式测试代码
public class Client { public static void main(String[] args) { Implementor implementor1 = new ConcreteImplementorA(); Abstraction abstraction1 = new RefinedAbstraction(Implementor1); abstraction1.request(); Implementor implementor2 = new ConcreteImplementorB(); Abstraction abstraction2 = new RefinedAbstraction(Implementor2); abstraction2.request(); }}
0x03:桥接模式的利用场景
因为桥接模式又称接口模式,所以能够了解为提供一个标准接口,而后多种实现。这种场景在我的项目开发中,在广泛不过了。
- 预警系统的信息处理形式
个别预警系统都提供了音讯告诉的性能,而音讯告诉的渠道多种多样,次要有站内音讯、邮件音讯和短信音讯。
- 多厂商对接
在做我的项目时,常常遇到一个同样的性能对接多个厂商的状况。这种状况普遍存在设施对接的我的项目中,之前小编在做柜面零碎时,常常遇到刷卡器、身份证读取器等设施同时对接多个厂商的状况。
- 日志框架
java畛域的日志框架,接口定义与具体实现框架。经常也是基于桥接模式实现适配应用的。
桥接模式的应用场景
- 一个类存在两个独立变动的维度,且这两个维度都须要进行扩大;
- 不心愿应用继承或因为多层次继承导致系统类的个数急剧减少的零碎 ;
- 如果一个零碎须要在构件的抽象化角色和具体化角色之间减少更多的灵活性,防止在两个档次之间建设动态的继承分割,通过桥接模式能够使它们在形象层建设一个关联关系;