title: Bridge模式
tag: 笔记 设计模式
Bridge模式
该模式的作用正如同它的名字“桥梁”的作用,它是用于连接一个类的下面两种东西:
- 类的功能层次结构
当我们希望为类扩展新的功能时会使用继承的手法来扩展功能,父类具有基本功能,子类增加新的功能。这样就会构成类层次结构。
- 类的实现层次结构
在接口或者抽象类中我们会定义一些抽象方法,然后交由子类进行具体实现。这些抽象方法的作用并不是用于扩展功能而是实现功能。
这样就构成了实现层次结构。
而我们的Bridge
模式的作用就是将类的功能层次结构和类的实现层次结构分离为两个独立的类层次结构,并搭建“桥梁”将它们连接起来。
介绍
**意图:**将抽象部分与实现部分分离,使它们都可以独立的变化。
**主要解决:**在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
**何时使用:**实现系统可能有多个角度分类,每一种角度都可能变化。
**如何解决:**把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。
**关键代码:**抽象类依赖实现类。
优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
**缺点:**桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
示例程序
该程序的作用是显示一些东西。
UML图:
Display
:抽象层次和实现层次连接的桥梁,基本作用是显示一段字符串(通过委托DisplayImpl
实现)。DisplayImpl
:实现层次的接口,被Display
使用,定义实现层的抽象方法。StringDisplayImpl
:实现层次的具体实现。CountDisplay
:对Display
的扩展,Display
的功能层次。
Display类
public class Display {
DisplayImpl impl;
public Display(DisplayImpl impl){
this.impl = impl;
}
public void open() {
impl.rawOpen();
}
public void print() {
impl.rawPrint();
}
public void close() {
impl.rawClose();
}
public final void display(){
open();
print();
close();
}
}
这里我们通过委托的方式连接了类的实现层次(DisplayImpl
接口);
DisplayImpl接口
public interface DisplayImpl {
void rawOpen();
void rawPrint();
void rawClose();
}
Display
的实现层次接口。
StringDisplayImpl类
public class StringDisplayImpl implements DisplayImpl{
private String s;
private int width;
public StringDisplayImpl(String s){
this.s = s;
this.width = s.length();
}
@Override
public void rawOpen() {
printLine();
}
@Override
public void rawPrint() {
System.out.print("|");
System.out.print(s);
System.out.println("|");
}
@Override
public void rawClose() {
printLine();
}
private void printLine(){
System.out.print("+");
for (int i = 0; i < width; i++){
System.out.print("-");
}
System.out.println("+");
}
}
Display
的具体实现层次,打印并加上边框输出传入的字符串。
CountDisplay类
public class CountDisplay extends Display{
public CountDisplay(DisplayImpl impl) {
super(impl);
}
public void multiDisplay(int n){
open();
for (int i = 0; i < n; i++) {
print();
}
close();
}
}
继承Display并扩展新功能(多次输出),属于Display
的功能层次。
测试
public static void main(String[] args) {
Display display = new Display(new StringDisplayImpl("Hello World!"));
display.display();
CountDisplay countDisplay = new CountDisplay(new StringDisplayImpl("Hello World!"));
countDisplay.multiDisplay(5);
}
输出:
+------------+
|Hello World!|
+------------+
+------------+
|Hello World!|
|Hello World!|
|Hello World!|
|Hello World!|
|Hello World!|
+------------+
Bridge模式的角色
Abstraction
(抽象化)
该角色位于“类的功能层次结构”的最上层。它使用Implementor
角色的方法定义了基本的功能。该角色中保存了Implementor
角色的实例。在示例程序中,由Display
类扮演此角色。
RefinedAbstraction
(改善后的抽象化)
在Abstraction
角色的基础上增加了新功能的角色。在示例程序中,由CountDisplay
类扮演此角色。
Implementor
(实现者)
该角色位于“类的实现层次结构”的最上层。它定义了用于实现Abstraction
角色的接口(API)的方法。在示例程序中,由DisplayImpl
类扮演此角色。
Concretelmplementor
(具体实现者)
该角色负责实现在Implementor
角色中定义的接口(API)。在示例程序中,由StringDisplayImpl
类扮演此角色。
Implementor
(实现者)
该角色位于“类的实现层次结构”的最上层。它定义了用于实现Abstraction
角色的接口(API)的方法。在示例程序中,由DisplayImpl
类扮演此角色。
Concretelmplementor
(具体实现者)
该角色负责实现在Implementor
角色中定义的接口(API)。在示例程序中,由StringDisplayImpl
类扮演此角色。