• Java 实现策略(Strategy)模式


    策略模式:行为型模式

    将同一行为,不同的处理算法分别封装起来。让它们之间能够互相替换

    1. 定义一个超类型接口,及 行为方法

    2. 定义不同的实现类,实现该行为的 不同的算法


    /**
     * 策略模式:针对同一命令(或行为),不同的策略做不同的动作
     *  商品促销
     *  本类为:收取现金的类
     *  
     *  @author stone
     */
    public interface ICashSuper {
    	 double acceptCash(double money);
    }

    /**
     * 正常收取现金
     * @author stone
     *
     */
    public class CashNormal implements ICashSuper {
    
    	@Override
    	public double acceptCash(double money) {
    		return money;
    	}
    
    }

    /**
     * 打折收取现金 
     * @author stone
     *
     */
    public class CashRebate implements ICashSuper {
    	private double rebate; //折扣
    	public CashRebate (double rebate) {
    		this.rebate = rebate;
    	}
    
    	@Override
    	public double acceptCash(double money) {
    		return new BigDecimal(money * rebate / 10).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    	}
    	
    	
    }

    /**
     * 让利返现  收取现金
     * @author stone
     *
     */
    public class CashReturn implements ICashSuper {
    	private double moneyCondition; //返现底限金额
    	private double returnMoney; //返还金额
    	public CashReturn(double moneyCondition, double returnMoney) {
    		this.moneyCondition = moneyCondition;
    		this.returnMoney = returnMoney;
    	}
    
    	@Override
    	public double acceptCash(double money) {//多重返利
    		if (money >= moneyCondition) {
    			return money - Math.floor(money / moneyCondition) * returnMoney;
    		} else {
    			return money;
    		}
    	}
    	
    	
    }

    /**
     * 依据传递的的策略类。运行对应的行为
     * @author stone
     *
     */
    public class CashContext {
    	private ICashSuper casher;
    	
    	public CashContext() {
    		
    	}
    	
    	public CashContext(ICashSuper casher) {
    		this.casher = casher;
    	}
    	
    	public void setCasher(ICashSuper casher) {
    		this.casher = casher;
    	}
    	
    	//依据详细的策略对象,调用它的算法行为
    	public double acceptCash(double money) {
    		return this.casher.acceptCash(money);
    	}
    	
    }

    /*
     * 策略(Strategy)模式 关注:行为的选择
     * 封装了一系列策略对象,用户来选择使用哪种策略对象
     * 与简单工厂的差别:
     * 		策略模式。传入策略对象给Context,由Context封装策略对象的方法调用,对外公开Context的方法接口
     * 		简单工厂模式,传入一个简单參数。创建对象,然后调用出厂对象的方法
     * 与装饰模式的差别:
     * 		非常明显。Context无需实现(implements)业务接口,不须要增强已有的策略对象的功能
     * 策略模式多用在算法决策系统中, 比方工资结算
     */
    public class Test {
    	public static void main(String[] args) {
    		double money = 998; //原价
    		CashContext cashContext = new CashContext(new CashNormal());
    		System.out.println("原价:" + cashContext.acceptCash(money)); //通常  策略
    		
    		cashContext.setCasher(new CashRebate(8.5));
    		System.out.println("打85折:" + cashContext.acceptCash(money)); //折扣   策略   85折
    		
    		cashContext.setCasher(new CashReturn(300, 50));
    		System.out.println("满300 返50:" + cashContext.acceptCash(money)); //返现  策略    满300 返50
    		
    	}
    }

    打印

    原价:998.0
    打85折:848.3
    满300 返50:848.0


  • 相关阅读:
    linux c dlopen加载动态链接库
    c++锁 测试 (gcc test.cpp -o test -lpthread)
    shell 清理目录下 超过一段时间的数据。
    大话存储学习笔记
    python总结
    正则表达式使用
    #linux shell#模拟日志生成过程
    深入理解Java虚拟机
    Nginx修改access.log日志时间格式
    mfcs100d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7017901.html
Copyright © 2020-2023  润新知