背景介绍
我们负责的是快递柜子相关的项目,用户类型有普通用户和快递员用户,多种订单类型(充值,退款等),多种支付方式(如支付宝,微信,余额,银联等),每种支付方式有对应的校验方式。
问题
在考虑到日后体系扩展的情况下,该怎么去设计?在文末给出答案。
桥接模式
简介
桥接模式(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进行支付。 这里使用工厂方法+责任链模式。