天天看點

設計模式--橋接模式1.定義2.使用場景及設計3.測試代碼4.總結

1.定義

使抽象和實作解耦,使之都可以獨立擴充不會影響對方

2.使用場景及設計

2.1.場景

現在有十種不同類型的電視,每種電視都有自己的遙控器,電視變化,對應的遙控器也要變化,而且如果新增一種電視型号,就要新增一種對應的遙控器

2.2.設計

使用橋接模式制作一個抽象tv接口,在抽象出一個RemoteControl遙控器類,使用RemoteControl類關聯(橋接)tv接口,将實作予以解耦,而且抽象和實作可以獨立擴充互不影響,如想給RemoteControl加個game功能,則不會對現有實作影響

2.3.類圖

設計模式--橋接模式1.定義2.使用場景及設計3.測試代碼4.總結

3.測試代碼

入口代碼

package com.glt.designpattern.bridge;

public class InitMain {

    public static void main(String[] args) {
        TV mi = new MiTV();
        TV sony = new SonyTV();

        ConcreteRemote miControl = new ConcreteRemote(mi);
        ConcreteRemote sonyControl = new ConcreteRemote(sony);

        miControl.on();
        miControl.setStation(5);
        miControl.nextChannel();

        sonyControl.on();
        sonyControl.setStation(10);
        sonyControl.nextChannel();

    }
}

           
package com.glt.designpattern.bridge;

/**
 * 電視接口
 */
public interface TV {

    /**
     * 開
     */
    public void on();

    /**
     * 關
     */
    public void off();

    /**
     * 切換頻道
     */
    public void tuneChannel(int channel);
}

           
package com.glt.designpattern.bridge;

/**
 * 抽象遙控器類
 */
public abstract class RemoteControl {
    TV tv;

    public RemoteControl(TV tv) {
        this.tv = tv;
    }

    public void on() {
        tv.on();
    }

    public void off() {
        tv.off();
    }

    public void setChannel(int channel) {
        tv.tuneChannel(channel);
    }
}

           
package com.glt.designpattern.bridge;

/**
 * 具體遙控器類
 */
public class ConcreteRemote extends RemoteControl {

    public int currentStation = 0;

    public ConcreteRemote(TV tv) {
        super(tv);
    }

    public void on() {
        super.on();
    }

    public void off() {
        super.on();
    }

    public void setStation(int currentStation) {
        this.currentStation = currentStation;
        setChannel(this.currentStation);
    }

    public void nextChannel() {
        setChannel(this.currentStation + 1);
    }

    public void prevChannel() {
        setChannel(this.currentStation - 1);
    }
}

           
package com.glt.designpattern.bridge;

/**
 * 小米-具體電視類
 */
public class MiTV implements TV {
    @Override
    public void on() {
        System.out.println("open xiaomi  tv ...");
    }

    @Override
    public void off() {
        System.out.println("close xiaomi  tv ...");
    }

    @Override
    public void tuneChannel(int channel) {
        System.out.println(String.format("change xiaomi  tv channel is %s", channel));
    }
}

           
package com.glt.designpattern.bridge;

/**
 * 索尼-具體電視類
 */
public class SonyTV implements TV {
    @Override
    public void on() {
        System.out.println("open sony  tv ...");
    }

    @Override
    public void off() {
        System.out.println("close sony  tv ...");
    }

    @Override
    public void tuneChannel(int channel) {
        System.out.println(String.format("change sony  tv channel is %s", channel));
    }
}

           

輸出如下

open xiaomi tv …

change xiaomi tv channel is 5

change xiaomi tv channel is 6

open sony tv …

change sony tv channel is 10

change sony tv channel is 11

4.總結

橋接模式其實也是為了抽象和實作解耦,通過橋接類保證tv和遙控器兩個次元互不影響單獨改變。

  • 優點

    1、抽象和實作的分離。

    2、優秀的擴充能力。

    3、實作細節對客戶透明

  • 缺點

    橋接會增加系統了解與設計的複雜程度,增加開發者的開發難度。

繼續閱讀