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