桥接模式:将实现与抽象放在两个不同的层次中,使两个层次可以独立改变。桥接模式基于类的最小设计原则,通过使用封装、聚合、继承等行为让不同的类承担不同的职责。它的主要特点是把抽象与行为实现分离开,从而可以保持各部分的独立性以及功能扩展。
它主要有以下几种角色:
Abstraction:Abstraction(维护了 implementor/即它的实现类)
RefindedAbstraction:扩充抽象类。
Implementor:实现类接口。
ConcreteImplementor:具体实现类
1、优点
(1)实现了抽象和实现部分的分离
桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。
(2)更好的可扩展性
由于桥接模式把抽象部分和实现部分分离了,从而分别定义接口,这就使得抽象部分和实现部分可以分别独立扩展,而不会相互影响,大大的提供了系统的可扩展性。
(3)可动态的切换实现
由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。
(4)实现细节对客户端透明,可以对用户隐藏实现细节。
2、缺点
(1)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
(2)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。
桥接模式的应用场景
1、不希望或不适用使用继承的场景
2、接口或抽象类不稳定的场景
3、重用性要求较高的场景
示例:
Implementor:
public interface Color {
String getColor();
}
ConcreteImplementor:
public class Blue implements Color{
@Override
public String getColor() {
return "蓝色";
}
}
public class Green implements Color{
@Override
public String getColor() {
return "绿色";
}
}
public class Pink implements Color{
@Override
public String getColor() {
return "粉色";
}
}
public class Yellow implements Color{
@Override
public String getColor() {
return "黄色";
}
}
RefindedAbstraction:
public abstract class Pen {
protected Color color;
public Pen(Color color) {
this.color = color;
}
public abstract void write();
}
ConcreteImplementor:
public class pencli extends Pen{
public pencli(Color color) {
super(color);
}
@Override
public void write() {
System.out.println("铅笔"+color.getColor());
}
}
public class MaoPen extends Pen{
public MaoPen(Color color) {
super(color);
}
@Override
public void write() {
System.out.println("毛笔"+color.getColor());
}
}
测试:
public class Test {
public static void main(String[] args) {
Color color=new Pink();
MaoPen maoPen=new MaoPen(color);
maoPen.write();
}
}
结果: