1.Bridge模式
将类的功能层次结构和实现层次结构分离
类的层次结构的两个作用:
-
增加新的功能
父类拥有基本功能,在子类中增加新的功能。
Something
----|SomethingGood
--------|SomethingBetter -
增加新的实现
父类声明抽象方法来定义接口(API),子类实现具体方法来实现接口
AbstractClass
----|ConcreteClass
----|AnotherConcreteClass
1.1 Bridge模式的类图
登场角色:
-
Abstraction(抽象化)
定义了基本功能,类功能层次结构的最顶层 -
RefinedAbstraction(改进后的抽象化)
在Abstraction角色基础上增加了功能 -
Implementor(实现者)
功能的真正的实现者,位于类实现层次结构的最顶层 -
ConcreteImplementor(具体的实现者)
实现了在Implementor中定义的接口
1.2 示例程序
类一览表:
名字 | 说明 |
---|---|
Display | 功能层次结构 |
DisplayImpl | 实现层次结构 |
CountDisplay | 扩展了功能层次结构 |
StringDisplayImpl | 一种实现方式 |
Main | 测试类 |
uml类图
Display类
package xin.ajay.bridge;
public class Display{
private DisplayImpl impl;
public Display(DisplayImpl impl){
this.impl = impl;
}
public void open(){
impl.open();
}
public void print(){
impl.print();
}
public void close(){
impl.close();
}
public final void display(){
open();
print();
close();
}
}
DisplayImpl类
package xin.ajay.bridge;
public abstract class DisplayImpl {
public abstract void open();
public abstract void print();
public abstract void close();
}
CountDisplay类
package xin.ajay.bridge;
public class CountDisplay extends Display {
public CountDisplay(DisplayImpl impl) {
super(impl);
}
public void multiDiplay(int times){
open();
for (int i = 0; i < times; i++) {
print();
}
close();
}
}
StringDisplayImpl类
package xin.ajay.bridge;
public class StringDisplayImpl extends DisplayImpl {
private String msg;
private int width;
public StringDisplayImpl(String msg) {
this.msg = msg;
this.width = msg.getBytes().length;
}
@Override
public void open() {
printLine();
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
@Override
public void print() {
System.out.println("|" + msg + "|");
}
@Override
public void close() {
printLine();
}
}
Mian类
package xin.ajay.bridge;
public class Main {
public static void main(String[] args) {
Display d1 = new Display(new StringDisplayImpl("hello"));
Display d2 = new CountDisplay(new StringDisplayImpl("hello"));
CountDisplay d3 = new CountDisplay(new StringDisplayImpl("hello"));
d1.display();
d2.display();
d3.multiDiplay(2);
}
}
结果
+-----+
|hello|
+-----+
+-----+
|hello|
+-----+
+-----+
|hello|
|hello|
+-----+
鸣谢
GoF《设计模式》和结城浩的《图解设计模式》