设计模式总结之桥接模式

206 阅读2分钟

背景介绍

我们负责的是快递柜子相关的项目,用户类型有普通用户和快递员用户,多种订单类型(充值,退款等),多种支付方式(如支付宝,微信,余额,银联等),每种支付方式有对应的校验方式。

问题

在考虑到日后体系扩展的情况下,该怎么去设计?在文末给出答案。

桥接模式

简介

桥接模式(Bridge Pattern)属于结构性模式。
主要是通过组合的方式在两个独立体系之间的建立起联系,而不是通过继承的方式。
其核心思想在于组合。 组合的方式有多种:如构造器。

范例

问题

如上图所示,这里X轴和Y轴是两个不同体系,但是在使用时又有关联;在保证结构清晰,方便两种体系的日后扩展的情况下,该怎么去设计?

具体实现

消息发送体系

public interface IMessage {
    //发送消息的内容和接收人
    void send(String message,String toUser);
}
public class SmsMessage implements IMessage {
    public void send(String message, String toUser) {
        System.out.println("使用短信消息发送" + message + "给" + toUser);
    }
}
public class EmailMessage implements IMessage {
    public void send(String message, String toUser) {
        System.out.println("使用邮件消息发送" + message + "给" + toUser);
    }
}

消息类型体系

public abstract class AbastractMessage {
    private IMessage message;

    public AbastractMessage(IMessage message) {
        this.message = message;
    }
    
    void sendMessage(String message,String toUser){
        this.message.send(message,toUser);
    }
}
public class NomalMessage extends AbastractMessage {
    public NomalMessage(IMessage message) {
        super(message);
    }

    @Override
    void sendMessage(String message, String toUser){
        message = "【普通】" + message;
        super.sendMessage(message,toUser);
    }
}
public class UrgencyMessage extends AbastractMessage {
    public UrgencyMessage(IMessage message) {
        super(message);
    }

    @Override
    void sendMessage(String message, String toUser){
        message = "【加急】" + message;
        super.sendMessage(message,toUser);
    }
}

类图

总结

如上代码和类图所示,在消息类型的父类中通过构造器持有了消息发送的接口对象,创建具体消息类型时传入指定的发送类型。
通过构造器持有的方式,使得两个不同体系得到了关联。

在项目中的实际运用

类图

总结

在用户订单构建器(抽象类)中持有了订单构建器(抽象类),在创建时根据不同的订单类型生成不同的订单构建器,传入用户订单构建器,生成用户订单构建器。这里使用桥接+工厂方法+策略模式。
用户订单构建器调用run方法,调用之前传入订单构建器的run()进入具体的订单创建责任链,最终创建订单,并返回需要的参数供app进行支付。 这里使用工厂方法+责任链模式。