桥接模式
1.定义:
将抽象部分与实现部分分离,使他们都可以独立的进行变化。
2.使用场景:
- 一个类存在着两个独立变化的维度,且这两个维度均需要进行扩展;
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,可以通过桥接模式使它们在抽象层建立一个关联关系;
- 对于不希望使用继承或因为多次继承导致系统类的个数急剧增加的系统,也可以考虑使用桥接模式。
3.UML图
4.详解:
桥接模式也称为桥梁模式,是一种结构型设计模式。其主要承担着连接两边(抽象部分与实现部分)的作用在,实际开发中,任何多维度变化类或者多个树状类之间的耦合都可以使用桥接模式来实现解耦。
在现实生活中,制作咖啡,有可能加糖或不加糖,咖啡的杯子可能是大的或小的,下面就以这个制作咖啡的例子,详细阐述桥接模式:
public interface CoffeAdd {
String addSomething();
}
public static class Sugar implements CoffeAdd {
@Override
public String addSomething() {
return "加糖";
}
}
public static class Ordinary implements CoffeAdd {
@Override
public String addSomething() {
return "原味";
}
}
上面定义了一个向咖啡里添加物品的接口,然后有两个具体的实现类:加糖(Sugar )与原味(Ordinary );
下面看制作咖啡的抽象类及其子类,可以看出,制作咖啡的抽象类(Coffe )持有了咖啡添加物的实例(CoffeAdd ),这就是上面所述的“抽象”与“实现”,Coffe对应于抽象部分,CoffeAdd对应于实现部分:
public static abstract class Coffe {
protected CoffeAdd coffeAdd;
public Coffe(CoffeAdd coffeAdd) {
this.coffeAdd = coffeAdd;
}
public abstract void makeCoffe();
}
public static class LargeCoffe extends Coffe {
public LargeCoffe(CoffeAdd coffeAdd) {
super(coffeAdd);
}
@Override
public void makeCoffe() {
System.out.println("大杯的" + coffeAdd.addSomething() + "咖啡");
}
}
public static class SmallCoffe extends Coffe {
public SmallCoffe(CoffeAdd coffeAdd) {
super(coffeAdd);
}
@Override
public void makeCoffe() {
System.out.println("小杯的" + coffeAdd.addSomething() + "咖啡");
}
}
测试代码:
public static void main(String[] args) {
Sugar sugar = new Sugar();
Ordinary ordinary = new Ordinary();
LargeCoffe largeSugerCoffe = new LargeCoffe(sugar);
largeSugerCoffe.makeCoffe();//大杯的加糖咖啡
LargeCoffe largeOrdinaryCoffe = new LargeCoffe(ordinary);
largeOrdinaryCoffe.makeCoffe();//大杯的原味咖啡
SmallCoffe smallSugarCoffe = new SmallCoffe(sugar);
smallSugarCoffe.makeCoffe();//小杯的加糖咖啡
SmallCoffe smallOrdinaryCoffe = new SmallCoffe(ordinary);
smallOrdinaryCoffe.makeCoffe();//小杯的原味咖啡
}
从输出结果一看便知,各种各样的咖啡均可制作出来了。
但是此时,如果想要制作中杯的咖啡呢?又或者想要给咖啡里加奶呢?其实很简单,上面已经定义了Coffe类以及CoffeAdd接口,仅需要再定义两个类,一个继承Coffe,一个实现CoffeAdd即可,见代码:
public static class MiddleCoffe extends Coffe {
public MiddleCoffe(CoffeAdd coffeAdd) {
super(coffeAdd);
}
@Override
public void makeCoffe() {
System.out.println("中杯的" + coffeAdd.addSomething() + "咖啡");
}
}
public static class Milk implements CoffeAdd {
@Override
public String addSomething() {
return "加奶";
}
}
测试代码就不再赘述了,相信大家都会明白。