设计模式之策略模式(行为型,方式自己随便选,都能达到目的就行)

介绍

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。

案例

场景:旅游路线(选择坐车、坐飞机、坐船…)、支付方式(选择支付宝、微信、京东白条…)、登录方式(选择QQ登录、账号登录、邮箱登录…),他们的算法类似,都是为了实现达到同一种目的。如:支付方式,最终的结果就是我支付了一笔钱出去了。下面就以网上购物为例,来看看策略模式的好处。
代码:
1>我们在网上购物付款的时候,肯定需要选择一种支付方式,下面先列出几种常用支付方式。

//支付宝支付
public class AliPay implements Payment {
    @Override
    public PayState pay(String uid, Double amount) {
        System.out.println("欢迎使用支付宝支付");
        System.out.println("查询账户余额,开始扣款");
        return new PayState(200,"支付成功",amount);
    }
}

//京东支付
public class JDPay implements Payment {
    @Override
    public PayState pay(String uid, Double amount) {
        System.out.println("欢迎使用京东白条支付");
        System.out.println("查询账户余额,开始扣款");
        return new PayState(200,"支付成功",amount);
    }
}

//银联支付
public class UnionPay implements Payment {
    @Override
    public PayState pay(String uid, Double amount) {
        System.out.println("欢迎使用银联支付");
        System.out.println("查询账户余额,开始扣款");
        return new PayState(200,"支付成功",amount);
    }
}

//微信支付
public class WeChatPay implements Payment {
    @Override
    public PayState pay(String uid, Double amount) {
        System.out.println("欢迎使用微信支付");
        System.out.println("查询账户余额,直接从微信红包扣款");
        return new PayState(200,"支付成功",amount);
    }
}

2>以上支付都实现了同一个支付接口。

/**
 * 支付渠道、方式
 */
public interface Payment {
    public PayState pay(String uid, Double amount);
}

3>将支付方式用枚举的形式列出来,这样用户付款的时候,只需要选择哪种支付途径即可,而不需要关心怎么去实现。

/**
 * 把枚举当成一个常量去维护
 */
public enum PayType {
    ALI_PAY(new AliPay()),
    WECHAT_PAY(new WeChatPay()),
    UNION_PAY(new UnionPay()),
    JD_PAY(new JDPay());

    private Payment payment;
    PayType(Payment payment){
        this.payment=payment;
    }
    public Payment getPayment() {
        return payment;
    }
}

4>选择好商品后,下订单。

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 PayState pay(PayType payType){
        return payType.getPayment().pay(uid,amount);
    }
}

5>支付成功后,会有一个支付状态(成功或失败)。

/**
 * 支付状态
 */
public class PayState {
    private int code;
    private String msg;
    private Object data;

    public PayState(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public String toString(){
        return "支付状态:【"+code+"】,"+msg+",交易详情:"+data;
    }
}

6>用户开始付款。

public class PayStrategyTest {
    public static void main(String[] args) {
        Order order=new Order("1","20180427001",351.21);

        //开始支付   微信支付、支付宝支付、银联支付、京东支付
        //每个渠道支付的算法是不一样的
        //基本算法固定,用户只有选择的权利
        System.out.println(order.pay(PayType.WECHAT_PAY));

        //执行结果:
        //欢迎使用微信支付
        //查询账户余额,直接从微信红包扣款
        //支付状态:【200】,支付成功,交易详情:351.21
    }
}

总结:策略模式其实就是定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的用户而独立变化。就像上面的支付一样,每种支付方式算法都不一样,但他们却可以相互替换,而这个替换完全取决于用户。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值