23种设计模式-java-桥接

模式概述:

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

使用场景:

1.如果你想要拆分或重组一个具有多重功能的庞杂类 (例如能与多个数据库服务器进行交互的类), 可以使用桥接模式。
2.如果你希望在几个独立维度上扩展一个类, 可使用该模式。
3.如果你需要在运行时切换不同实现方法, 可使用桥接模式。

代码样例:

代码背景: 桥接模式有两种理解方式,一种是类有多个独立变化的维度,通过组合模式代替继承来实现各个维度的独立扩展;还有另外一种比较“纯正”的理解,即Gof的《设计模式》中定义的“将抽象和实现解耦,让它们可以独立变化”(代码样例是这种理解方式);这里的抽象和实现并不是指的抽象类和接口的实现;这里的抽象是指与实际行为实现无关抽象出来的“类库”,实现是指具体行为实现相关的“类库”。以下代码是以遥控器控制设备运作的样例,其中设备就是实现部分,遥控器就是抽象部分;实现部分可以独自扩展出收音机、电视等,抽象部分可以独立扩展多种附加功能的高级遥控器。桥接模式与策略模式、适配器模式都是基于组合思想将工作委派给其他对象。

/**
 * 设备(实现部分)
 */
public  interface Device {
    /**
     * 是否开机
     */
    public boolean isEnable();
    /**
     * 关机
     */
    public void disable();

    /**
     * 开机
     */
    public void enable();

    /**
     * 设置音量
     */
    public void setVolume(int volume);

    /**
     * 获取当前音量
     */
    public int getVolume();
}
/**
 * 收音机
 */
public class Radio implements Device{
    private boolean on = false;
    private int volume = 30;

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

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

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

    @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 getVolume(){
        return volume;
    }

    @Override
    public String toString() {
        return "Radio{" +
                "on=" + on +
                ", volume=" + volume +
                '}';
    }
}
/**
 * 收音机
 */
public class Tv implements Device{
    private boolean on = false;
    private int volume = 30;

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

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

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

    @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 getVolume(){
        return volume;
    }

    @Override
    public String toString() {
        return "Tv{" +
                "on=" + on +
                ", volume=" + volume +
                '}';
    }
}
/**
 * 遥控器(抽象部分)
 */
public interface Remote {
    /**
     * 开关按钮
     */
    public void power();

    /**
     * 加音量
     */
    public void upVolume();

    /**
     * 减音量
     */
    public void downVolume();

}
/**
 * 遥控器base实现类
 */
public class BaseRemoteImpl implements Remote{
    protected Device device;

    public BaseRemoteImpl(Device device) {
        this.device = device;
    }

    @Override
    public void power() {
        if(device.isEnable()){
            device.disable();
        }else{
            device.enable();
        }
    }

    @Override
    public void upVolume() {
        device.setVolume(device.getVolume()+10);
    }

    @Override
    public void downVolume() {
        device.setVolume(device.getVolume()-10);
    }

    public void getDeviceStatus(){
        System.out.println(device.toString());
    }
}
/**
 * 一种高级遥控器
 */
public class AdvancedRemoteImpl extends BaseRemoteImpl{

    public AdvancedRemoteImpl(Device device) {
        super(device);
    }

    /**
     * 静音
     */
    public void mute(){
        device.setVolume(0);
    }
}
public class TestBridge {
    public static void main(String[] args) {
        BaseRemoteImpl baseRemote = new BaseRemoteImpl(new Radio());
        baseRemote.upVolume();
        baseRemote.getDeviceStatus();

        AdvancedRemoteImpl advancedRemote = new AdvancedRemoteImpl(new Tv());
        advancedRemote.mute();
        advancedRemote.getDeviceStatus();
    }
}

测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值