策略模式和责任链模式(2)

简介: 策略模式和责任链模式(2)

这时候我们客户端代码就应该这样写了


public class Test {
    public static void main(String[] args) {
        PromotionActivity activity618 = new PromotionActivity(new CouponStrategy());
        PromotionActivity activityllll = new PromotionActivity(new CashbackStrategy());
        activity618.execute();
        activityllll.execute();
    }
}


运行效果如下:


使用优惠券抵扣


代码优化之后 , 是不是我们程序猿小哥哥的维护工作就轻松了?每次上新活动,不影响原来的代码

逻辑。


用策略模式实现选择支付方式的业务场景

为了加深对策略模式的理解,我们再来举一个案例。 相信小伙伴们都用过支付宝、微信支付、银联

支付以及京东白条。 —个常见的应用场景就是大家在下单支付时会提示选择支付方式,如果用户未选,

系统也会默认好推荐的支付方式进行结算。来看一下类图,下面我们用策略模式来描拟此业务场罢 :



image.png


创建 Payment 抽象类,定义支付规范和支付逻辑,代码如下 :


public abstract class Payment {
    public abstract String getName();
    //通用逻辑放到抽象类里面实现
    public MsgResult pay(String uid, double amount) {
        //余额是否足够
        if (queryBalance(uid) < amount) {
            return new MsgResult(500, "支付失败", "余额不足");
        }
        return new MsgResult(200, "支付成功", "支付金额" + amount);
    }
    protected abstract double queryBalance(String uid);
}


分别创建具体的支付方式,支付宝 AliPay类 :


public class AliPay extends Payment {
    public String getName() {
        return "支付宝";
    }
    protected double queryBalance(String uid) {
        return 900;
    }
}


京东白条JDPay 类 :


public class JDPay extends Payment {
    public String getName() {
        return "京东白条";
    }
    protected double queryBalance(String uid) {
        return 500;
    }
}


微信支付 WechatPay类 :


public class WechatPay extends Payment {
    public String getName() {
        return "微信支付";
    }
    protected double queryBalance(String uid) {
        return 263;
    }
}


银联支付 UnionPay 类 :


public class UnionPay extends Payment {
    public String getName() {
        return "银联支付";
    }
    protected double queryBalance(String uid) {
        return 120;
    }
}


创建支付状态的包装类 MsgResult:


public class MsgResult {
    private int code;
    private Object data;
    private String msg;
    public MsgResult(int code, String msg, Object data) {
        this.code = code;
        this.data = data;
        this.msg = msg;
    }
    @Override
    public String toString() {
        return "MsgResult{" +
                "code=" + code +
                ", data=" + data +
                ", msg='" + msg + '\'' +
                '}';
    }
}


创建支付策略管理类 :


public class PayStrategy {
    public static  final String ALI_PAY = "AliPay";
    public static  final String JD_PAY = "JdPay";
    public static  final String WECHAT_PAY = "WechatPay";
    public static  final String UNION_PAY = "UnionPay";
    public static  final String DEFAULT_PAY = ALI_PAY;
    private static Map<String,Payment> strategy = new HashMap<String,Payment>();
    static {
        strategy.put(ALI_PAY,new AliPay());
        strategy.put(JD_PAY,new JDPay());
        strategy.put(WECHAT_PAY,new WechatPay());
        strategy.put(UNION_PAY,new UnionPay());
    }
    public static Payment get(String payKey){
        if(!strategy.containsKey(payKey)){
            return strategy.get(DEFAULT_PAY);
        }
        return strategy.get(payKey);
    }
}


创建订单 Order 类 :


public class Order {
    private String uid;
    private String orderId;
    private double amount;
    public Order(String uid, String orderId, double amount) {
        this.uid = uid;
        this.orderId = orderId;
        this.amount = amount;
    }
    public MsgResult pay(){
        return pay(PayStrategy.DEFAULT_PAY);
    }
    public MsgResult pay(String payKey){
        Payment payment = PayStrategy.get(payKey);
        System.out.println("欢迎使用" + payment.getName());
        System.out.println("本次交易金额为" + amount + ",开始扣款");
        return payment.pay(uid,amount);
    }
}


测试代码 :


public class Test {
    public static void main(String[] args) {
        Order order = new Order("1","2020031401000323",324.5);
        System.out.println(order.pay(PayStrategy.UNION_PAY));
    }
}


运行结果 :


欢迎使用银联支付
本次交易金额为324.5,开始扣款
MsgResult{code=500, data=余额不足, msg='支付失败'}


希望通过大家耳熟能详的业务场景来举例,让小伙伴们更深刻地理解策略模式。希望小伙伴们在面

试和工作体现出自己的优势。

目录
相关文章
|
2月前
|
设计模式 Java
【设计模式】责任链模式
【设计模式】责任链模式
|
2月前
|
设计模式
设计模式之责任链模式
设计模式之责任链模式
|
1月前
|
设计模式 架构师 NoSQL
设计模式第六讲:责任链模式和迭代器模式详解
遍历任务交由迭代器完成,这简化了聚合类。  C. 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
145 0
|
2月前
|
设计模式 前端开发
【设计模式】之责任链模式
职责链模式是一种非常有用的设计模式,在前端开发中经常用于处理复杂的请求流程和数据验证。它通过将请求发送者和接收者解耦,并将请求沿着一个链条依次传递下去,实现了优雅地处理请求流程。通过使用职责链模式,我们可以提高代码的可维护性和可扩展性。然而,在应用职责链模式时需要权衡其带来的优缺点,并根据具体情况进行选择。
52 0
|
10月前
|
设计模式 Java
设计模式~~~责任链模式(职责链模式)
设计模式~~~责任链模式(职责链模式)
45 0
|
10月前
|
设计模式 C++
C++设计模式之责任链模式
好多新学设计模式的同学,对责任链模式一知半解,今天以C++为例,做个简单的分享。
|
11月前
|
设计模式 存储 Java
设计模式-行为型模式:责任链模式
设计模式-行为型模式:责任链模式
|
设计模式 算法 Java
设计模式之不一样的责任链模式
设计模式之不一样的责任链模式
114 0
|
设计模式
【设计模式】行为型模式-第 3 章第 1 讲【责任链模式】
【设计模式】行为型模式-第 3 章第 1 讲【责任链模式】
【设计模式】行为型模式-第 3 章第 1 讲【责任链模式】
|
设计模式 Java
设计模式-16-责任链模式
责任链模式(Chain of Responsibility Pattern)就是在一个请求出去后,将请求的接受对象串为一个链路。请求对象只负责将请求发送出去,不管这个链路中哪个对象接受处理,将请求的发送者和接收者进行解耦。属于行为型模式。
97 0
设计模式-16-责任链模式