设计模式——结构型模式(二)

Bridge(桥接模式)

目标

将抽象部分与他的实现部分分离,使它们都可以独立地变化。

结构

结构图

桥接模式在抽象父类中存储一个抽象的Implementor指针,然后在子类实现的时候传递一个ConcreteImplementor。Client直接调用抽象父类的相应方法即可。

协作

时序图

Client在创建了一个具体的功能实现类对象,将这个功能传递给父类,这样就获得一个能够实现功能的操作类。

使用情形

  1. 抽象和实现部分之间有一个固定的绑定关系;

  2. 类的抽象以及实现部分可以通过生成子类的方法进行扩充,此时可以通过对不同的抽象接口和实现进行组合并且分别进行扩充;

  3. 对一个抽象的实现方法的修改应该不影响用户;

  4. 你需要将一个具有很多将要生成的子类的类分成两部分。

  5. 与适配器模式的最大区别就在于,适配器模式是在使用的时候进行的组合,桥接模式是在最开始构架的时候设计好的。

参与者

  • Abstraction

    定义并且维护一个纸箱Implementor类型对象的指针。

  • RefinedAbstraction

    扩展后的Abstraction。

  • Implementor

    定义实现类的接口。

  • Implementor

    实现具体的Implementor类方法。

效果

  1. 分离接口及其实现方式。(在某方面避免了用户通过反射获得实现的信息?)

  2. 提高可扩展性,实现细节对客户透明。

代码实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
abstract class WaterBottle{
private ContainsWater contains;
public WaterBottle(ContainsWater containsWater) {
this.contains = containsWater;
}
public void containsWater() {
contains.contains();
}
}
class HotWaterBottle extends WaterBottle{
public HotWaterBottle() {
super(new ContainsHotWater());
}
}
class CoolWaterBottle extends WaterBottle{
public CoolWaterBottle{
super(new ContainsCoolWater());
}
}
abstract class ContainsWater{
abstract public void contains();
};
class ContainsHotWater extends ContainsWater{
@Override
public void contains() {
System.out.println("Hot water!");
}
}
class ContainsCoolWater extends ContainsWater{
@Override
public void contains() {
System.out.println("Cooooool water!");
}
}
public class Client{
private WaterBottle bottle1;
private WaterBottle bottle2;
public static void main(String args[]) {
bottle1 = new HotWaterBottle();
bottle2 = new CoolWaterBottle();
bottle1.containsWater();
bottle2.containsWater();
}
}

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2018 Alex's Blog All Rights Reserved.

Yifeng Tang hält Urheberrechtsansprüche.