桥接模式(bridge)

定义

  将抽象部分与实现部分分离,使它们都可以独立的变化。

UML类图

  

角色

  Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。

  上图中ConcreteImplementor是决堤的实现,而refineAbstraction是抽象,让两者分离,就是桥接模式的主要功能。

例子

  可以通过遥控器让电视完成各种各样的功能。

  Implementor

package com.csdhsm.pattemdesign.bridge;

/**  
 * @Title:  ITV.java   
 * @Description: 电视功能接口
 * @author: Han   
 * @date:   2016年6月27日 下午1:48:07  
 */  
public interface ITV {
    
    //开电视
    public void on();
    //关电视
    public void off();
    //选择频道
    public void switchChannel(int channel);
}

  具体实现类

package com.csdhsm.pattemdesign.bridge;

/**  
 * @Title:  SamsungTV.java   
 * @Description: 三星电视
 * @author: Han   
 * @date:   2016年6月27日 上午11:25:28  
 */  
public class SamsungTV implements ITV {

    @Override
    public void on() {
        System.out.println("Samsung is turned on.");
    }

    @Override
    public void off() {
        System.out.println("Samsung is turned off.");
    }

    @Override
    public void switchChannel(int channel) {
        System.out.println("Samsung: channel - " + channel);
    }
}
package com.csdhsm.pattemdesign.bridge;

/**  
 * @Title:  SonyTV.java   
 * @Description: 索尼电视 
 * @author: Han   
 * @date:   2016年6月27日 上午11:27:49  
 */  
public class SonyTV implements ITV {

    @Override
    public void on() {
        System.out.println("Sony is turned on.");
    }

    @Override
    public void off() {
        System.out.println("Sony is turned off.");
    }

    @Override
    public void switchChannel(int channel) {
        System.out.println("Sony: channel - " + channel);
    }
}

  遥控器抽象类

package com.csdhsm.pattemdesign.bridge;

/**  
 * @Title:  AbstractRemoteControl.java   
 * @Description: 遥控器抽象类,包含对TV的引用
 * @author: Han   
 * @date:   2016年6月27日 下午1:25:21  
 */  
public abstract class AbstractRemoteControl {
    
    private ITV tv;

    public AbstractRemoteControl(ITV tv) {
        this.tv = tv;
    }
    
    public void turnOn() {
        tv.on();
    }
    
    public void turnOff() {
        tv.off();
    }
    
    public void setChannel(int channel) {
        tv.switchChannel(channel);
    }
}

  遥控器的具体实现类

package com.csdhsm.pattemdesign.bridge;

/**  
 * @Title:  LogitechRemoteControl.java   
 * @Description: 遥控器的具体实现类
 * @author: Han   
 * @date:   2016年6月27日 下午1:51:53  
 */  
public class LogitechRemoteControl extends AbstractRemoteControl {

    public LogitechRemoteControl(ITV tv) {
        super(tv);
    }
    
    public void setChannelKeyBoard(int channel) {
        super.setChannel(channel);
        System.out.println("Logitech use keyword to set channel.");
    }
}

  客户端

package com.csdhsm.pattemdesign.bridge;

public class Solution {
    
    public static void main(String[] args) {
        ITV tv = new SonyTV();
        LogitechRemoteControl lrc = new LogitechRemoteControl(tv);
        lrc.setChannelKeyBoard(100); 
    }
}

总结

  桥接模式关键是把抽象与行为实现相分离,动态结合。

 posted on 2016-06-27 13:56  韩思明  阅读(201)  评论(0编辑  收藏  举报