桥接模式
一、概念
桥接模式是一种结构型模式,主要应对的是:由于实际需要,某个类具有两个或者两个以上维度的变化,如果只是使用继承无法满足这种变化,或者使设计变得相当臃肿。
举例说明:假设现在需要为某个餐厅制作菜单,餐厅提供牛肉面、猪肉面、羊肉面、鸡肉面。。。而且顾客可以根据需要自己选择是否加辣。此时就产生
了一个问题:如何应对这种变化呢?是否要定制无辣牛肉面,微辣牛肉面,特辣牛肉面。。。。?如果是这样岂非一值忙于定制子类?
为了解决这个问题,可是使用桥接模式,桥接模式的做法是把变化的部分抽象出来,使变化部分与主类分离开来,从而将多个维度的变化彻底分离。最后提供一个管理类来组合不同维度上的变化,通过这种组合来满足业务需求。
二、实例
下面以一个简单示例来示范桥接模式。程序首先提供一个Peppery接口,该接口代表了是否添加辣椒。
1 2 3 4
| public interface Peppery {
String style(); }
|
接着为其提供两个实现类,代表辣与不辣
1 2 3 4 5 6 7
| public class PepperyStyle implements Peppery { //实现辣味风格的方法 @Override public String style() { return "辣味很重,很爽。。"; } }
|
1 2 3 4 5 6 7 8
| public class PlainStyle implements Peppery {
//实现不辣风格的方法 @Override public String style() { return "味道清淡,很好吃...."; } }
|
接着提供一个AbstractNoodle抽象类,该抽象类有一个Peppery的属性,该属性代表了辣味的风格程序通过AbstractNoodle组合一个Peppery对象,从而
运行了面条在辣味这个风格上的变化;而个AbstractNoodle又有不同的实现类,代表了面条在材料这个风格上的变化,下面问个AbstractNoodle提供两
个实现类,分别表示猪肉面和牛肉面。
1 2 3 4 5 6 7 8 9 10 11
| public class ProkyNoodle extends AbstractNoodle {
public ProkyNoodle(Peppery peppery) { super(peppery); }
@Override public void eat() { System.out.println("这是一碗猪肉面"+super.style.style()); } }
|
1 2 3 4 5 6 7 8 9 10
| public class BeefNoodle extends AbstractNoodle { public BeefNoodle(Peppery peppery) { super(peppery); }
@Override public void eat() { System.out.println("这是一碗牛肉面"+super.style.style()); } }
|
下面通过一个主类来生产不同风格的面条:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class main { public static void main(String[] args) { //辣味 Peppery peppery = new PepperyStyle(); //不辣 Peppery plain = new PlainStyle();
//来一碗辣的猪肉面 AbstractNoodle noodle1 = new ProkyNoodle(peppery); noodle1.eat(); //来一碗不辣的猪肉面 AbstractNoodle noodle2 = new ProkyNoodle(plain); noodle2.eat(); //来一碗辣的牛肉面 AbstractNoodle noodle3 = new BeefNoodle(peppery); noodle3.eat(); //来一碗不辣的牛肉面 AbstractNoodle noodle4 = new BeefNoodle(plain); noodle4.eat(); } }
|
程序运行结果:
这是一碗猪肉面辣味很重,很爽。。
这是一碗猪肉面味道清淡,很好吃....
这是一碗牛肉面辣味很重,很爽。。
这是一碗牛肉面味道清淡,很好吃....