概述
是一种很实用的结构性设计模式,用于解决多变化维度的情况
定义
将抽象部分与它的实现部分分离,使他们都可以独立的变化。
角色
Abstraction(抽象类)
定义了一个Implementor(实现类接口)类型的对象并可以维护该对象。与Implementor之间具有关联关系。
RefinedAbstraction(扩充抽象类)
通常为具体类,实现了Abstraction(抽象类)中声明的抽象业务方法,RefinedAbstraction(扩充抽象类)中可以调用Implementor(实现类接口)中定义的业务方法。
Implementor(实现类接口)
定义实现类的接口,定义的接口不一定要与Abstraction(抽象类)的接口完全一致。一般而言,Implementor(实现类接口)提供基本操作,Abstraction(抽象类)会做更复杂的操作
ConcreteImplementor(具体实现类)
具体实现Implementor(实现类接口)接口。
例子
场景
使用大中小三种型号的毛笔进行画图,并且有12个不同的颜料盒。
分析与实现
由于型号是其固有的维度,因此可以设计一个抽象的毛笔类,在该类中声明 并部分实现毛笔的业务方法,而将各种型号的毛笔作为其子类;颜色是毛笔的另一个维度,由于它与毛笔之间存在一种“设置”的关系,因此我们可以提供一个抽象的颜色接口,而将具体的颜色作为实现该接口的子类。在此,型号可认为是毛笔的抽象部分,而颜色是毛笔的实现部分.
抽象类
public abstract class Abstraction {
protected Implementor implementor;
public void setImplementor(Implementor implementor) {
this.implementor = implementor;
}
public abstract void drawPicture();
}
扩充抽象类
public class SmallRefinedAbstraction extends Abstraction {
@Override
public void drawPicture() {
implementor.drawColor("小号");
}
}
public class MiddleRefinedAbstraction extends Abstraction {
@Override
public void drawPicture() {
implementor.drawColor("大号");
}
}
public class LargeRefinedAbstraction extends Abstraction {
@Override
public void drawPicture() {
implementor.drawColor("大号");
}
}
实现类接口
public interface Implementor {
void drawColor(String type);
}
具体实现类
public class BlueConcreteImplementor implements Implementor {
@Override
public void drawColor(String type) {
System.out.println("使用蓝色"+type+"毛笔着色");
}
}
public class GreenConcreteImplementor implements Implementor {
@Override
public void drawColor(String type) {
System.out.println("使用绿色"+type+"毛笔着色");
}
}
...
测试类
public class Client {
public static void main(String[] args) {
Implementor implementor;
Abstraction abstraction;
implementor = new BlueConcreteImplementor();
abstraction = new LargeRefinedAbstraction();
abstraction.setImplementor(implementor);
abstraction.drawPicture();
}
}
测试结果:
使用蓝色大号毛笔着色
优点
(1)分离抽象接口及其实现部分
(2)取代多层继承
(3)在维度内中拓展性好
缺点
(1)增加系统的理解与设计难度
(2)要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限 性,如何正确识别两个独立维度也需要一定的经验积累
适用场景
(1)需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静 态的继承关系
(2)系统需要对抽象化角色和实现化角色进行动态耦合
(3)一个类存在两个(或多个) 独立变化的维度,且这两个(或多个) 维度都需要独立进行扩 展。
(4)对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤 为适用