桥接模式的核心是:将抽象与实现分离开来,使他们可以独立变化。
实现模式:
主要解决:
在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
何时使用:
实现系统可能有多个角度分类,每一种角度都可能变化。
如何解决:
把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。
关键代码:
抽象类依赖实现类。
应用实例:
1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选择。
2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。
优点:
1、抽象和实现的分离。
2、优秀的扩展能力。
3、实现细节对客户透明。
缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
使用场景:
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
注意事项:
对于两个独立变化的维度,使用桥接模式再适合不过了。
Implementation
具体实现思路:
通过实例的时候所带的参数来决定,究竟是声明什么的实例,大家都是属于一个大类的内部类,并且内部类中有父子的关系,所以可以通过构造方法,当做踏板,实现要想输出的内容。
package api;
public class Demo {
public static void main(String[] args) {
RCA.RemoteControl remoteControl1 = new RCA().new ConcreteRemoteControl1(new RCA());
remoteControl1.on();
RCA.RemoteControl remoteControl2 = new RCA(). new ConcreteRemoteControl2(new Sony());
remoteControl2.on();
}
}
abstract class TV {
public abstract void on();
}
class Sony extends TV {
@Override
public void on() {
System.out.println("Sony.on()");
}
}
class RCA extends TV {
@Override
public void on() {
System.out.println("RCA.on()");
}
abstract class RemoteControl {
protected TV tv;
public RemoteControl(TV tv) {
this.tv = tv;
}
public abstract void on();
}
class ConcreteRemoteControl1 extends RemoteControl {
public ConcreteRemoteControl1(TV tv) {
super(tv);
}
@Override
public void on() {
System.out.println("ConcreteRemoteControl1.on()");
tv.on();
}
}
class ConcreteRemoteControl2 extends RemoteControl {
public ConcreteRemoteControl2(TV tv) {
super(tv);
}
@Override
public void on() {
System.out.println("ConcreteRemoteControl2.on()");
tv.on();
}
}
}