桥接模式

业务场景(待改造)

/**
 * 消息统一接口
 */
public interface Message {
    /**
     * 发送消息
     * @param msg
     */
    void send(String msg);
}

/**
 * 站内短消息的方式发送消息
 */
class CommonMessageSMS implements Message{
    @Override
    public void send(String msg) {
        System.out.println("使用站内短消息的方式发送消息" + msg);
    }
}

class CommonMessageEmail implements Message{
    @Override
    public void send(String msg) {
        System.out.println("使用Email的方式发送消息" + msg);
    }
}

/**
 * 加急消息的抽象接口
 */
interface UrgencyMessage extends Message{
    /**
     * 监控某消息的处理过程
     * @param messageId
     */
    void watch(String messageId);
}

class UrgencyMessageSMS implements UrgencyMessage{
    @Override
    public void send(String msg) {
        System.out.println("使用站内短消息的方式发送加急消息");
    }

    @Override
    public void watch(String messageId) {
        System.out.println("监控" + messageId);
    }
}

class UrgencyMessageEmail implements UrgencyMessage{
    @Override
    public void send(String msg) {
        System.out.println("使用Email的方式发送加急消息");
    }

    @Override
    public void watch(String messageId) {
        System.out.println("监控" + messageId);
    }
}

在这里插入图片描述

存在的问题:
1、后增加的UrgencyMessage必须实现Email和SMS两种方式,如果再出现一种新的消息类型,类的数量就会不合理的增长。
2、如果再增加了一种新的消息发送方式比如微信,那么所有的消息种类都要增加它的实现,很多地方都要修改。

桥接模式(改造后)


/**
 * 消息发送方式
 */
public interface SendMessageType {
    /**
     * 发送消息
     */
    void send(String message);
}

class SendBySMS implements SendMessageType{
    @Override
    public void send(String message) {
        System.out.println("站内短消息方式发送");
    }
}

class SendByEmail implements SendMessageType{
    @Override
    public void send(String message) {
        System.out.println("email方式发送");
    }
}

abstract class AbstractMessage{
    private SendMessageType sendMessageType;

    public AbstractMessage(SendMessageType sendMessageType) {
        this.sendMessageType = sendMessageType;
    }

    public void sendMessage(String message){
        sendMessageType.send(message);
    }
}

class CommonMessage extends AbstractMessage{
    public CommonMessage(SendMessageType sendMessageType) {
        super(sendMessageType);
    }
}

class UrgencyMessage extends AbstractMessage{
    public UrgencyMessage(SendMessageType sendMessageType) {
        super(sendMessageType);
    }

    void watch(String messageId){
        System.out.println("监控消息"  + messageId);
    }
}


/**
 * 新添加的发送消息种类
 */
class SendByWeChat implements SendMessageType{
    @Override
    public void send(String message) {
        System.out.println("微信方式发送");
    }
}

/**
 * 新添加的消息类型
 */
class SepialMessage extends AbstractMessage{
    public SepialMessage(SendMessageType sendMessageType) {
        super(sendMessageType);
    }

    void watch(String messageId){
        System.out.println("催促消息"  + messageId);
    }
}

在这里插入图片描述

定义

将抽象和具体实现分离,使它们可以独立的变化。
桥接是在被分离了的抽象部分和实现部分搭桥,维护这个关系。
桥接模式适应两个维度的变化,继承适用一个维度的变化。要求正确识别出系统中两个独立变化的维度。

UML类图

/**
 * 定义实现部分的接口
 */
public interface Implementor {
    void operationImpl();
}

/**
 * 抽象部分接口
 */
abstract class Abstraction{
    protected Implementor impl;

    public Abstraction(Implementor impl) {
        this.impl = impl;
    }

    public void operation(){
        impl.operationImpl();
    }
}

/**
 * 具体的实现类A
 */
class ConcreteImplementorA implements Implementor{
    @Override
    public void operationImpl() {

    }
}
class ConcreteImplementorB implements Implementor{
    @Override
    public void operationImpl() {

    }
}

/**
 * 扩展抽象部分的接口
 */
class RefinedAbstraction extends  Abstraction{
    public RefinedAbstraction(Implementor impl) {
        super(impl);
    }

    public void otherOperation(){

    }
}

在这里插入图片描述
Abstraction:抽象部分的接口。里面持有具体的Implementor抽象引用。肩负者桥接的重任。

RefinedAbstraction:扩展抽象部分接口,里面会实现实际业务方法。

Implementor:要被桥接的对象的抽象。
ConcreteImplementor:要被桥接的对象的实现。

适用场景

如果某个业务场景,有2个维度的变化,中间有交集,就适合用桥接模式解决。对比之下,如果用继承,消息类别如果有M个,发送方式有N个,共有M* N种组合,M*N个类。桥接模式能够解决这种两个变化维度的情况下的场景,继承改成了组合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值