zoukankan      html  css  js  c++  java
  • 简单易懂设计模式——策略模式

    一.策略模式

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

    在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

    二.一个商场促销例子

    1.抽象类

    package strategic;
    
    /**
     * 现金收费抽象类
     * @author wuwuyong
     *
     */
    abstract class CashSuper {
    
        public double acceptCash(double money) {
            return money;
        }
    }

    2.正常收费子类

    package strategic;
    
    /**
     * 正常收费子类
     * @author wuwuyong
     *
     */
    public class CashNormal extends CashSuper {
    
        public double acceptCash(double money) {
            return money;
        }
    }

    3.打折收费子类

    package strategic;
    
    /**
     * 打折收费子类
     * @author wuwuyong
     *
     */
    public class CashRebate extends CashSuper {
    
        private double moneyRebate = 1;
        
        public CashRebate(Double moneyRebate) {
            this.moneyRebate = moneyRebate;
        }
        
        public double acceptCash(double money) {
            return money * this.moneyRebate;
        }
    }

    4.返利收费子类

    package strategic;
    
    /**
     * 返利收费子类
     * @author wuwuyong
     *
     */
    public class CashReturn extends CashSuper {
    
        private double moneyCondition = 0;
        private double moneyReturn = 0;
        
        public CashReturn(double moneyCondition, double moneyReturn) {
            this.moneyCondition = moneyCondition;
            this.moneyReturn = moneyReturn;
        }
        
        public double acceptCash(double money) {
            double result = money;
            if (money >= moneyCondition) {
                result = money - moneyReturn;
            }
            return result;
        }
    }

    5.CashContext

    package strategic;
    
    public class CashContext {
    
        private CashSuper cs;
        
        public CashContext(String type) {
            switch (type) {
            case "正常收费":
                cs = new CashNormal();
                break;
            case "满300返100":
                cs = new CashReturn(300, 100);
                break;
            case "打8折":
                cs = new CashRebate(0.8);
                break;
            }
        }
        
        public double getResult(double money) {
            return cs.acceptCash(money);
        }
    }

    6.测试

    package strategic;
    
    public class Test {
    
        public static void main(String[] args) {
            double result = 0;
            
            CashContext normal = new CashContext("正常收费");
            result = normal.getResult(300);
            System.out.println("正常收费:"+result);
            
            CashContext cashReturn = new CashContext("满300返100");
            result = cashReturn.getResult(300);
            System.out.println("满300返100:"+result);
            
            CashContext cashRebate = new CashContext("打8折");
            result = cashRebate.getResult(300);
            System.out.println("打8折:"+result);
        }
    }

    三.URL图

  • 相关阅读:
    数据库
    Xpath表达式
    错误:向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们
    xmlhttp status各类Http请求状态(status)及其含义
    配置ckeditor3.0 和ckfinder
    程序默认用管理员身份打开(vs2010)
    (转)CKFinder破解的方法,去掉提示
    无法嵌入互操作类型“SHDocVw.ShellWindowsClass”。请改用适用的接口
    ASP.NET页面执行顺序
    回调函数
  • 原文地址:https://www.cnblogs.com/wuwuyong/p/13200228.html
Copyright © 2011-2022 走看看