设计模式学习总结(十一)--桥接模式

定义

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。

包含角色:

  • Abstraction:抽象类
  • RefinedAbstraction:扩充抽象类
  • Implementor:实现类接口
  • ConcreteImplementor:具体实现类

优缺点

优点:

  • 分离抽象接口及其实现部分。提高了比继承更好的解决方案。
  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
  • 实现细节对客户透明,可以对用户隐藏实现细节。

缺点:

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

实例

OA 系统中流程传递需要发送消息提醒用户,消息的级别也有普通、紧急区分。
发送方式有邮件、短信等。

消息发送接口:

public interface IMessageImplementor {
    void send(String toUser, String message);
}

消息发送实现类:

public class MessageSMS implements IMessageImplementor {
    @Override
    public void send(String toUser, String message) {
        System.out.println(String.format("短信发送至:%s内容为:%S",toUser,message));
    }
}

public class MessageEmail implements IMessageImplementor {
    @Override
    public void send(String toUser, String message) {
        System.out.println(String.format("邮件发送至:%s内容为:%S",toUser,message));
    }
}

消息抽象类:

public abstract class AbstractMessage {

    private IMessageImplementor implementor;

    public AbstractMessage(IMessageImplementor implementor){
        this.implementor = implementor;
    }

    public void sendMessage(String toUser , String message){
        this.implementor.send(toUser,message);
    }

}

实际消息类:


public class CommonMessage extends AbstractMessage{

    public CommonMessage(IMessageImplementor implementor) {
        super(implementor);
    }
}

public class UrgentMessage extends AbstractMessage{

    public UrgentMessage(IMessageImplementor implementor) {
        super(implementor);
    }

    @Override
    public void sendMessage(String toUser, String message) {
        // 实现紧急消息自己的逻辑
        String urgentMessage = "紧急:"+message;
        super.sendMessage(toUser, urgentMessage);
    }
}

调用:

public static void main(String[] args) {
    IMessageImplementor messageSMS = new MessageSMS();
    IMessageImplementor messageEmail = new MessageEmail();
    // 普通消息 + 邮件发送
    AbstractMessage commonMessage1 = new CommonMessage(messageEmail);
    commonMessage1.sendMessage("MarkLogZhu","test");
    
    // 普通消息 + 短信发送
    AbstractMessage commonMessage2 = new CommonMessage(messageSMS);
    commonMessage2.sendMessage("MarkLogZhu","test");
    
    // 紧急消息 + 邮件发送
    AbstractMessage urgentMessage1 = new UrgentMessage(messageEmail);
    urgentMessage1.sendMessage("MarkLogZhu","test");
    
    // 紧急消息 + 短信发送
    AbstractMessage urgentMessage2 = new UrgentMessage(messageSMS);
    urgentMessage2.sendMessage("MarkLogZhu","test");
}

控制台输出:

邮件发送至:MarkLogZhu内容为:TEST
短信发送至:MarkLogZhu内容为:TEST
邮件发送至:MarkLogZhu内容为:紧急:TEST
短信发送至:MarkLogZhu内容为:紧急:TEST
原文地址:https://www.cnblogs.com/markLogZhu/p/11582591.html