zoukankan      html  css  js  c++  java
  • 策略模式精讲

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

    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
  • 相关阅读:
    高级软件工程--第八次作业
    高级软件工程2017第7次作业--C++团队项目:Beta阶段综合报告
    Bate测试报告
    版本发布说明
    Beta版本展示博客
    Beta阶段总结分析报告
    Bate敏捷冲刺每日报告--day5
    Bate敏捷冲刺每日报告--day4
    Bate敏捷冲刺每日报告--day3
    Kettle中通过触发器方式实现数据 增量更新
  • 原文地址:https://www.cnblogs.com/cleveraboy/p/9742454.html
Copyright © 2011-2022 走看看