结构型模式之桥接模式

x33g5p2x  于2022-02-12 转载在 其他  
字(4.7k)|赞(0)|评价(0)|浏览(169)

1、 意图

桥接模式是一种结构型设计模式,可将 一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。

2、问题

假如你有一个几何形状类,从它能扩展除两个子类:圆形和方形。你希望对这样的类层次结构进行扩展以使其包含颜色,所以要创建名为红色Red和蓝色的形状子类。但是,由于你已有两个子类,所有总共序要创建四个类才能覆盖所有组合,例如蓝色圆形和红色方形。

3、解决方案

问题的根本原因使我们试图在两个独立的维度——形状和颜色——上扩展形状类。这在处理类继承时是很常见的问题。

桥接模式通过将继承改为组合的方式来解决这个问题。具体来说,就是抽取其中一个维度并使之成为独立的类层次,这样就可以在初始类中 引用这个新层次的对象,从而使得一个类不必拥有所有的状态和行为。

4、适合的应用场景

1)如果你想要拆分或重组一个具有多重功能的庞杂类可以使用桥接模式

类的代码行数越多, 弄清其运作方式就越困难, 对其进行修改所花费的时间就越长。 一个功能上的变化可能需要在整个类范围内进行修改, 而且常常会产生错误, 甚至还会有一些严重的副作用。

桥接模式可以将庞杂类拆分为几个类层次结构。 此后, 你可以修改任意一个类层次结构而不会影响到其他类层次结构。 这种方法可以简化代码的维护工作, 并将修改已有代码的风险降到最低。

2)在几个独立维度上扩展一个类,可使用该模式

桥接建议将每个维度抽取为独立的类层次。 初始类将相关工作委派给属于对应类层次的对象, 无需自己完成所有工作。

5、实现方式

1)明确类中独立的维度。独立的概念可能是:抽象/平台,域/基础设施,前端/后端或接口/实现
2)了解客户端你的业务需求,并在抽象基类中定义它们。
3)确定在所有平台上都可执行的业务。并在通用实现接口中声明抽象部分所需的业务。
4)为你在域内的所有平台创建实现类,但需确保它们遵循实现部分的接口。
5)为你在域内的所有平台创建实现类,但需确保它们遵循实现部分的接口。
6)在抽象类中添加指向实现类型的引用成员变量。抽象部分会将大部分工作委派给该成员变量所指向的实现对象。
7)如果你的高层逻辑有多个实体,则可通过扩展抽象基类为每个变体创建一个精确抽象。
8)客户端代码必须将实现对象传递给抽象部分的构造函数才能使其能够相互关联。此后,客户端只需与抽象对象进行交互,无需和实现对象打交道。

6、Java代码示例

/**
 * 所有设备的通用接口
 */
public interface Device {
    boolean isEnabled();
    void enable();
    void disable();
    int getVolume();
    void setVolume(int percent);
    int getChannel();
    void setChannel(int channel);
    void printStatus();

}
/**
 *收音机类
 */
public class Redio implements Device {
    private boolean on=false;
    private int volume=30;
    private int channel=1;
    @Override
    public boolean isEnabled(){
        return on;
    }
    @Override
    public void enable(){
        on=true;
    }
    @Override
    public void disable(){
        on=false;
    }

    @Override
    public int getVolume() {
        return volume;
    }

    @Override
    public void setVolume(int volume) {
        if(volume>100){
            this.volume=100;
        }else if(volume<0){
            this.volume=0;
        }else {
            this.volume=volume;
        }
    }

    @Override
    public int getChannel() {
        return channel;
    }

    @Override
    public void setChannel(int channel) {
        this.channel=channel;
    }

    @Override
    public void printStatus() {
        System.out.println("------------------------------------");
        System.out.println("| 我是收音机.");
        System.out.println("| I'm " + (on ? "enabled" : "disabled"));
        System.out.println("| Current volume is " + volume + "%");
        System.out.println("| Current channel is " + channel);
        System.out.println("------------------------------------\n");
    }

}
public class Tv implements Device{
    private boolean on=false;
    private int volume=30;
    private int channel=1;

    @Override
    public boolean isEnabled() {
        return on;
    }

    @Override
    public void enable() {
        on=true;
    }

    @Override
    public void disable() {
        on=false;
    }

    @Override
    public int getVolume() {
        return volume;
    }

    @Override
    public void setVolume(int volume) {
        if(volume>100){
            this.volume=100;
        }else if(volume<0){
            this.volume=0;
        }else {
            this.volume=volume;
        }
    }

    @Override
    public int getChannel() {
        return channel;
    }

    @Override
    public void setChannel(int channel) {
        this.channel=channel;
    }

    @Override
    public void printStatus() {
        System.out.println("------------------------------------");
        System.out.println("| 我是电视.");
        System.out.println("| I'm " + (on ? "enabled" : "disabled"));
        System.out.println("| Current volume is " + volume + "%");
        System.out.println("| Current channel is " + channel);
        System.out.println("------------------------------------\n");
    }
}
/**
 * 所有远程控制控制器的通用接口
 */
public interface Remote {
    void power();
    void volumeDown();
    void volumeUp();
    void channelDown();
    void channelUp();
}
/**
 * 基础远程控制器
 */
public class BasicRemote implements Remote{
    protected Device device;
    public BasicRemote(){}
    public BasicRemote(Device device){
        this.device=device;
    }

    @Override
    public void power() {
        System.out.println("Remote :power toggle");
        if(device.isEnabled()){
            device.disable();
        }else{
            device.enable();
        }
    }

    @Override
    public void volumeDown() {
        System.out.println("remote:volume down");
        device.setVolume(device.getVolume()-10);

    }

    @Override
    public void volumeUp() {
        System.out.println("Remote:volume up");
        device.setVolume(device.getVolume()+10);

    }

    @Override
    public void channelDown() {
        System.out.println("Remote:channel down");
        device.setVolume(device.getVolume()+10);
    }

    @Override
    public void channelUp() {
        System.out.println("Remote :channel up");
    }
}
/**
 * 高级的远程控制器
 */
public class AdvancedRemote extends BasicRemote{
    public AdvancedRemote(Device device){
        super.device=device;
    }
    public void mute(){
        System.out.println("Remote:mute");
        device.setVolume(0);
    }
}
/**
*客户端
*/
public class BridgePatternDemo {

    public static void testDevice(Device device){
        System.out.println("Test with basic remote.");
        BasicRemote basicRemote=new BasicRemote(device);
        basicRemote.power();
        device.printStatus();

        System.out.println("Tests with advanced remote.");
        AdvancedRemote advancedRemote = new AdvancedRemote(device);
        advancedRemote.power();
        advancedRemote.mute();
        device.printStatus();
    }
    public static void main(String[] args){
        testDevice(new Tv());

    }
}

with advanced remote.");
AdvancedRemote advancedRemote = new AdvancedRemote(device);
advancedRemote.power();
advancedRemote.mute();
device.printStatus();
}
public static void main(String[] args){
testDevice(new Tv());

}

}

相关文章

微信公众号

最新文章

更多