设计模式

桥接模式

一、概念

桥接模式是一种结构型模式,主要应对的是:由于实际需要,某个类具有两个或者两个以上维度的变化,如果只是使用继承无法满足这种变化,或者使设计变得相当臃肿。
举例说明:假设现在需要为某个餐厅制作菜单,餐厅提供牛肉面、猪肉面、羊肉面、鸡肉面。。。而且顾客可以根据需要自己选择是否加辣。此时就产生
了一个问题:如何应对这种变化呢?是否要定制无辣牛肉面,微辣牛肉面,特辣牛肉面。。。。?如果是这样岂非一值忙于定制子类?
为了解决这个问题,可是使用桥接模式,桥接模式的做法是把变化的部分抽象出来,使变化部分与主类分离开来,从而将多个维度的变化彻底分离。最后提供一个管理类来组合不同维度上的变化,通过这种组合来满足业务需求。

二、实例

下面以一个简单示例来示范桥接模式。程序首先提供一个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();
}
}
程序运行结果:
这是一碗猪肉面辣味很重,很爽。。
这是一碗猪肉面味道清淡,很好吃....
这是一碗牛肉面辣味很重,很爽。。
这是一碗牛肉面味道清淡,很好吃....
文章目录
  1. 1. 一、概念
  2. 2. 二、实例