策略模式精讲

Posted cleveraboy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了策略模式精讲相关的知识,希望对你有一定的参考价值。

策略模式是一种行为型模式,他的特点就是执行流程固定,但中间的步骤有一些差别;运行的时候才确定。官方的意思是:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。下面使用穷举法举几个简单理解的例子:

1.诸葛亮的锦囊妙计,每一个锦囊就是一个策略.

2.旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 

3.固定算法的封装等等。

4.网上购物买东西选择支付方式。

场景:根据用户的需求处理数据时候需要对算法做出选择,固定的一些算法,但是可以扩展。

下面有一个选择支付方式的代码进行演示:

package pattern.strategy.pay.payport;
import pattern.strategy.pay.PayState;
/**
 * 支付渠道
 */
public interface Payment {
   public  PayState pay(String uid,double amount);
}
package pattern.strategy.pay.payport;
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 get(){ return this.payment; } }
package pattern.strategy.pay.payport;
import pattern.strategy.pay.PayState;
public class AliPay implements Payment {
    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("欢迎使用支付宝");
        System.out.println("查询账户余额,开始扣款");
        return new PayState(200,"支付成功",amount);
    }
}
package pattern.strategy.pay.payport;
import pattern.strategy.pay.PayState;
public class JDPay implements Payment {
    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("欢迎使用京东支付");
        System.out.println("查询账户余额,开始扣款");
        return new PayState(200,"支付成功",amount);
    }
}
package pattern.strategy.pay.payport;
import pattern.strategy.pay.PayState;
public class UnionPay implements Payment {
    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("欢迎使用银联支付");
        System.out.println("查询账户余额,开始扣款");
        return new PayState(200,"支付成功",amount);
    }
}
package pattern.strategy.pay.payport;
import pattern.strategy.pay.PayState;
public class WechatPay implements Payment {
    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("欢迎使用微信支付");
        System.out.println("查询账户余额,开始扣款");
        return new PayState(200,"支付成功",amount);
    }
}
package pattern.strategy.pay;
import pattern.strategy.pay.payport.PayType;
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.get().pay(this.uid,this.amount);
    }

}
package pattern.strategy.pay;

public class PayState {

    private int code;
    private Object data;
    private String msg;

    public PayState(int code,String msg,Object data){
        this.code=code;
        this.msg=msg;
        this.data=data;
    }

    public String toString() {
        return ("支付状态:["+code+"],"+msg+",交易详情:"+data);
    }
}
package pattern.strategy;
import pattern.strategy.pay.Order;
import pattern.strategy.pay.payport.PayType;
public class StrategyTest {
    public static void main(String[] args) {
        Order order=new Order("1","22233333",320);
        System.out.println(order.pay(PayType.ALI_PAY));
    }
}

测试结果:

欢迎使用支付宝
查询账户余额,开始扣款
支付状态:[200],支付成功,交易详情:320.0

 


以上是关于策略模式精讲的主要内容,如果未能解决你的问题,请参考以下文章

「每天一个知识点」精讲设计模式面试专题

设计模式课程 设计模式精讲 13-1 享元模式coding

设计模式课程 设计模式精讲 9-2 原型模式coding

策略模式-设计模式

设计模式课程 设计模式精讲 27-2 状态模式coding

设计模式课程 设计模式精讲 8-5 单例设计模式-饿汉式