天天看點

設計模式(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《設計模式》和結城浩的《圖解設計模式》