桥接模式
在生活中,我们可能会遇到这样的需求,例如我们画画,需要三种不同的颜色(红黄绿)搭配,也需要三种不同型号(大中小)的画笔,现在有两种不同的方案供我们选择,一种是选择同时具有颜色和型号的画笔,这样总共就需要九只画笔,如果需要增加一种颜色,那么对应的必须增加三种这种颜色的不同型号的画笔,显然颜色和画笔型号耦合在了一块。另一种是带型号的画笔和颜料分开,绘画时自由组合,这样只需要三只画笔和三种颜料即可,如果需要增加画笔型号或者颜色,只需要增加对应颜料和画笔即可,极大的降低了耦合性并且总的对象也会大大减少,程序设计里面的桥接模式就是利用了这种思想,也就是利用组合取代了继承。
桥接(Bridge)模式包含以下主要角色。
-
抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
-
扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
-
实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
-
具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
代码如下
//抽象角色
public abstract class Pen {
protected Color color;
public Pen(Color color) {
this.color = color;
}
abstract void size();
}
public class Lpen extends Pen {
public Lpen(Color color) {
super(color);
}
@Override
void size() {
System.out.println("我是大号笔");
color.name();
}
}
public class Mpen extends Pen{
public Mpen(Color color) {
super(color);
}
@Override
void size() {
System.out.println("我是中号笔");
color.name();
}
}
public class Spen extends Pen {
public Spen(Color color) {
super(color);
}
@Override
void size() {
System.out.println("我是小号笔");
color.name();
}
}
//实现化角色
public interface Color {
void name();
}
public class Green implements Color {
@Override
public void name() {
System.out.println("我是绿色");
}
}
public class Red implements Color{
@Override
public void name() {
System.out.println("我是红色");
}
}
public class Yellow implements Color{
@Override
public void name() {
System.out.println("我是黄色");
}
}
public class Client {
public static void main(String[] args) {
//使用组合得到红色大号画笔;
Pen pen = new Lpen(new Red());
pen.size();
}
}
结果