桥接模式详解及案例分析

文章目录

  • 桥接模式
    • 定义
    • 案例一
    • 桥接模式的优点
    • 桥接模式的缺点

桥接模式

通过组合的方式建立两个类之间的联系,而不是继承。数据结构型模式

定义

在 GoF 的《设计模 式》一书中,桥接模式是这么定义的:“Decouple an abstraction from its implementation so that the two can vary independently。”翻译成中文就是:“将抽 象和实现解耦,让它们可以独立变化。”

桥接模式详解及案例分析_第1张图片

案例一

桥接模式详解及案例分析_第2张图片

API 接口监控告警:根据不同的告警规则,触发不 同类型的告警。告警支持多种通知渠道,包括:邮件、短信、微信、自动语音电话。通知的
紧急程度有多种类型,包括:SEVERE(严重)、URGENCY(紧急)、NORMAL(普 通)、TRIVIAL(无关紧要)。

  • 我们先来看最简单、最直接的一种实现方式。代码如下所示
@Getter
@AllArgsConstructor
public enum NotificationEmergencyLevel {
    SEVERE, URGENCY, NORMAL, TRIVIAL
}

public class Notification {
    private List<String> emailAddresses;
    private List<String> telephones;
    private List<String> wechatIds;
    public Notification() {}
    
    public void setEmailAddress(List<String> emailAddress) {
        this.emailAddresses = emailAddress;
    }
    
    public void setTelephones(List<String> telephones) {
        this.telephones = telephones;
    }
    
    public void setWechatIds(List<String> wechatIds) {
        this.wechatIds = wechatIds;
    }
    
    public void notify(NotificationEmergencyLevel level, String message) {
        if (level.equals(NotificationEmergencyLevel.SEVERE)) {
            //...自动语音电话
        }else if(level.equals(NotificationEmergencyLevel.URGENCY)){
            //...发微信
        }else if(level.equals(NotificationEmergencyLevel.NORMAL)){
            //...发邮件
        }else if(level.equals(NotificationEmergencyLevel.TRIVIAL)){
            //...发邮件
        }
    }
}
  • 以上暴露的问题:破坏单一职责,太多if else(4*3种结果), 耦合性强,灵活度不高。

  • 使用桥接模式

public interface MsgSender {

    void send(String message);
}
// 邮件
public class EmailMsgSender implements MsgSender {

    private List<String> emails;

    public EmailMsgSender(List<String> emails) {
        this.emails = emails;
    }

    @Override
    public void send(String message) {
        System.out.println("邮件通知:" + message + " 被发送人:" + emails);
    }
}
// 电话
public class TelephoneMsgSender implements MsgSender {

    private List<String> telephones;

    public TelephoneMsgSender(List<String> telephones) {
        this.telephones = telephones;
    }

    @Override
    public void send(String message) {
        System.out.println("电话通知:" + message + " 被发送人:" + telephones);
    }
}
// 微信
public class WechatMsgSender implements MsgSender {

    private List<String> webchats;

    public WechatMsgSender(List<String> webchats) {
        this.webchats = webchats;
    }

    @Override
    public void send(String message) {
        System.out.println("微信通知:" + message + " 被发送人:" + webchats);
    }
}

// 这里就是桥
public abstract class Notification {

    protected MsgSender msgSender;

    public Notification(MsgSender msgSender) {
        this.msgSender = msgSender;
    }

    public abstract void notify(String message);
}

public class NormalNotification extends Notification {

    public NormalNotification(MsgSender msgSender) {
        super(msgSender);
    }

    @Override
    public void notify(String message) {
        msgSender.send("【正常的】"+message);
    }
}

public class SevereNotification extends Notification {

    public SevereNotification(MsgSender msgSender) {
        super(msgSender);
    }

    @Override
    public void notify(String message) {
        //加急逻辑
        msgSender.send("【严重】"+message);
    }
}

public class TrivialNotification extends Notification {

    public TrivialNotification(MsgSender msgSender) {
        super(msgSender);
    }

    @Override
    public void notify(String message) {
        msgSender.send("【不重要的】"+message);
    }
}

public class UrgencyNotification extends Notification {

    public UrgencyNotification(MsgSender msgSender) {
        super(msgSender);
    }

    @Override
    public void notify(String message) {
        msgSender.send("【紧急的】"+message);
    }
}

  • UML
    桥接模式详解及案例分析_第3张图片

可以看到发送类型维度和消息状态类型两种维度没有发生任何交集,但通过Notification可以将他们连接起来,所以可以把Notification当做桥。使他们任意组合。

桥接模式的优点

  • 分离抽象部分及其具体实现部分
  • 提高了系统的扩展性
  • 符合开闭原则
  • 符合合成复用原则

桥接模式的缺点

  • 增加了系统的理解与设计难度
  • 需要正确的识别系统中两个独立变化的维度

你可能感兴趣的:(设计模式,设计模式,java)