[设计模式]桥接模式

1. 定义

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

2. 类图

  

  Abstraction:抽象部分接口,通常在这个对象中,要维护一个实现部分的对象引用,抽象方法里面的方法,需要调用实现部分的对象来完成。

  RefinedAbstraction:扩展抽象部分的接口

  Implementor:实现部分接口

  ConcreteImplementor:具体实现Implementor的对象

3. 实例

package com.jerry.designpattern;
/**
 * 
 * @author Jerry
 * @date 2015年2月9日 下午10:46:29
 */
public abstract class AbstractMessage {
    protected IMessage msg;
    
    public AbstractMessage(IMessage msg) {
        this.msg = msg;
    }
    
    public abstract void sendMessage(String message, String user);
}

package com.jerry.designpattern;
/**
 * 
 * @author Jerry
 * @date 2015年2月9日 下午10:50:56
 */
public class CommonMessage extends AbstractMessage{

    public CommonMessage(IMessage msg) {
        super(msg);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void sendMessage(String message, String user) {
        // TODO Auto-generated method stub
        this.msg.send(message, user);
    }
}

package com.jerry.designpattern;
/**
 * 
 * @author Jerry
 * @date 2015年2月9日 下午10:44:43
 */
public interface IMessage {
    void send(String message, String user);
}

package com.jerry.designpattern;
/**
 * 
 * @author Jerry
 * @date 2015年2月9日 下午10:50:07
 */
public class MessageEmail implements IMessage{

    @Override
    public void send(String message, String user) {
        // TODO Auto-generated method stub
        System.out.println("使用邮件方式发信息<" + message + ">给 " + user);
    }

}

package com.jerry.designpattern;
/**
 * 
 * @author Jerry
 * @date 2015年2月9日 下午10:59:10
 */
public class MessagePhone implements IMessage{

    @Override
    public void send(String message, String user) {
        // TODO Auto-generated method stub
        System.out.println("使用手机方式发信息<" + message + ">给 " + user);
    }

}

package com.jerry.designpattern;
/**
 * 
 * @author Jerry
 * @date 2015年2月9日 下午10:48:23
 */
public class MessageSMS implements IMessage{

    @Override
    public void send(String message, String user) {
        // TODO Auto-generated method stub
        System.out.println("使用站内短消息方式发信息<" + message + ">给 " + user);
    }

}

package com.jerry.designpattern;
/**
 * 
 * @author Jerry
 * @date 2015年2月9日 下午10:59:50
 */
public class SpecialUrgencyMessage extends AbstractMessage{

    public SpecialUrgencyMessage(IMessage msg) {
        super(msg);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void sendMessage(String message, String user) {
        // TODO Auto-generated method stub
        System.out.println("十万火急!");
        this.msg.send(message, user);
    }

}

package com.jerry.designpattern;
/**
 * 
 * @author Jerry
 * @date 2015年2月9日 下午10:52:14
 */
public class UrgencyMessage extends AbstractMessage{

    public UrgencyMessage(IMessage msg) {
        super(msg);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void sendMessage(String message, String user) {
        // TODO Auto-generated method stub
        System.out.println("紧急信息");
        this.msg.send(message, user);
        this.warning();
    }

    private void warning() {
        // TODO Auto-generated method stub
        System.out.println("请尽快处理");
    }

}

package com.jerry.designpattern;
/**
 * 
 * @author Jerry
 * @date 2015年2月9日 下午10:54:10
 */
public class Client {
    public static void main(String[] args) {
        IMessage sms = new MessageSMS();
        IMessage email = new MessageEmail();
        IMessage phone = new MessagePhone();
        
        AbstractMessage commonMessage = new CommonMessage(sms);
        commonMessage.sendMessage("请于明天上午9点在花果山集合", "猪八戒");
        
        AbstractMessage urgencyMessage = new UrgencyMessage(email);
        urgencyMessage.sendMessage("附近有妖怪,悟空", "悟空");
        
        AbstractMessage specialUrgencyMessage = new SpecialUrgencyMessage(phone);
        specialUrgencyMessage.sendMessage("师傅被妖怪抓走了!", "大师兄");
    }
}

4. 什么是桥接

  所谓桥接,通俗的讲就是在不同的东西之间塔一座桥,让它们能够连接起来,可以相互通信和使用。

5. 桥接的优点

  a. 分离抽象和实现部分

  b. 更好的扩展性

  c. 可动态的切换实现

  d. 减少子类的数量

  

原文地址:https://www.cnblogs.com/jerry19890622/p/4333823.html