友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。
公众号的微信号是: jikerizhi 。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
7. 桥接模式
7.1. 定义
根据 GoF 的著名著作 《设计模式》,桥接模式的定义如下:
- 桥接模式(Bridge)
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
— Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides
《设计模式》
《设计模式》
7.2. 类图
什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象[DPE]。
桥接模式的核心意图就是把这些实现独立出来,让它们各自地变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。
Implementor类
ConcreteImplementorA和ConcreteImplementorB等派生类
Abstraction类
RefinedAbstraction类
桥接模式所说的‘将抽象部分与它的实现部分分离’,还是不好理解,我的理解就是实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。
在发现我们需要多角度去分类实现对象,而只用继承会造成大量的类增加,不能满足开放-封闭原则时,就应该要考虑用桥接模式了。
只要真正深入地理解了设计原则,很多设计模式其实就是原则的应用而已,或许在不知不觉中就在使用设计模式了。
代码 51. bridge/Abstraction.java 类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.diguage.didp.bridge;
/**
* Abstraction 类
*
* @author D瓜哥, https://www.diguage.com/
* @since 2017-05-19 17:53:33
*/
public abstract class Abstraction {
protected Implementor implementor;
public void setImplementor(Implementor implementor) {
this.implementor = implementor;
}
public void operation() {
implementor.operationImpl();
}
}
代码 52. bridge/ConcreteImplementorA.java 类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.diguage.didp.bridge;
/**
* ConcreteImplementorA 类
*
* @author D瓜哥, https://www.diguage.com/
* @since 2017-05-19 17:53:33
*/
public class ConcreteImplementorA extends Implementor {
@Override
public void operationImpl() {
System.out.println("具体实现A的方法执行!");
}
}
代码 53. bridge/ConcreteImplementorB.java 类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.diguage.didp.bridge;
/**
* ConcreteImplementorB 类
*
* @author D瓜哥, https://www.diguage.com/
* @since 2017-05-19 17:53:33
*/
public class ConcreteImplementorB extends Implementor {
@Override
public void operationImpl() {
System.out.println("具体实现B的方法执行!");
}
}
代码 54. bridge/Implementor.java 类
1
2
3
4
5
6
7
8
9
10
11
package com.diguage.didp.bridge;
/**
* Implementor 类
*
* @author D瓜哥, https://www.diguage.com/
* @since 2017-05-19 17:53:33
*/
public abstract class Implementor {
public abstract void operationImpl();
}
代码 55. bridge/RefinedAbstraction.java 类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.diguage.didp.bridge;
/**
* RefinedAbstraction 类
*
* @author D瓜哥, https://www.diguage.com/
* @since 2017-05-19 17:53:33
*/
public class RefinedAbstraction extends Abstraction {
@Override
public void operation() {
implementor.operationImpl();
}
}
代码 56. bridge/Client.java 类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.diguage.didp.bridge;
/**
* @author D瓜哥, https://www.diguage.com/
* @since 2017-05-26
*/
public class Client {
public static void main(String[] args) {
Abstraction abstraction = new RefinedAbstraction();
abstraction.setImplementor(new ConcreteImplementorA());
abstraction.operation();
abstraction.setImplementor(new ConcreteImplementorB());
abstraction.operation();
}
}