前言
本文代码托管在:https://github.com/Wuchenwcf/MyCode/tree/master/DP/MyDB/Bridge
1.问题提出
使用Bridge模式实现星巴克制作咖啡业务流程
咖啡有不同的选项,如下图所示:
如果采用传统的方法为每一种咖啡创建一个类,则需要创建4*4*3*3=234个类,工作量太大,所以考虑使用桥接模式。
二、设计实现
参考上图的继承关系,创建四个抽象类,为每个抽象类创建其对应的实现类。然后在Coffee这个类中集合其他三个抽象类。
package com.bridge.coffee;
import com.bridge.Foam.AbstractFoam;
import com.bridge.cupsize.AbstractCupsize;
import com.bridge.milk.AbstractMilk;
public class AbstractCoffee {
private AbstractCupsize cupsize;
private AbstractMilk milk;
private AbstractFoam foam;
public AbstractCupsize getCupsize() {
return cupsize;
}
public void setCupsize(AbstractCupsize cupsize) {
this.cupsize = cupsize;
}
public AbstractMilk getMilk() {
return milk;
}
public void setMilk(AbstractMilk milk) {
this.milk = milk;
}
public AbstractFoam getFoam() {
return foam;
}
public void setFoam(AbstractFoam foam) {
this.foam = foam;
}
}
这样,在客户端中使用不同选项的咖啡就很简单了
package com.bridge.main;
import com.bridge.Foam.NoFoam;
import com.bridge.coffee.AbstractCoffee;
import com.bridge.coffee.American;
import com.bridge.cupsize.Short;
import com.bridge.milk.Soy;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
AbstractCoffee coffe=new American();
coffe.setCupsize(new Short());
coffe.setFoam(new NoFoam());
coffe.setMilk(new Soy());
System.out.println("Coffe:"+coffe);
System.out.println("Cupsize:"+coffe.getCupsize());
System.out.println("Foam"+coffe.getFoam());
System.out.println("Milk:"+coffe.getMilk());
}
}
三、桥接模式总结
优点:
抽象部分与实现部分隔离,使不同维度可以独立变化。
实现部分的改变不会影响客户端
代码编写简单
缺点:
设计复杂
抽象类的修改会影响子类
使用性:
使用于需要在实现部分变化或扩展的系统