天天看点

设计模式(JAVA)——Bridge模式1.Bridge模式

1.Bridge模式

将类的功能层次结构和实现层次结构分离

类的层次结构的两个作用:

  1. 增加新的功能

    父类拥有基本功能,在子类中增加新的功能。

    Something

    ----|SomethingGood

    --------|SomethingBetter

  2. 增加新的实现

    父类声明抽象方法来定义接口(API),子类实现具体方法来实现接口

    AbstractClass

    ----|ConcreteClass

    ----|AnotherConcreteClass

1.1 Bridge模式的类图

设计模式(JAVA)——Bridge模式1.Bridge模式

登场角色:

  • Abstraction(抽象化)

    定义了基本功能,类功能层次结构的最顶层

  • RefinedAbstraction(改进后的抽象化)

    在Abstraction角色基础上增加了功能

  • Implementor(实现者)

    功能的真正的实现者,位于类实现层次结构的最顶层

  • ConcreteImplementor(具体的实现者)

    实现了在Implementor中定义的接口

1.2 示例程序

类一览表:

名字 说明
Display 功能层次结构
DisplayImpl 实现层次结构
CountDisplay 扩展了功能层次结构
StringDisplayImpl 一种实现方式
Main 测试类

uml类图

设计模式(JAVA)——Bridge模式1.Bridge模式

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《设计模式》和结城浩的《图解设计模式》