博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 实现策略(Strategy)模式
阅读量:7055 次
发布时间:2019-06-28

本文共 2340 字,大约阅读时间需要 7 分钟。

策略模式:行为型模式

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

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

转载地址:http://dzlol.baihongyu.com/

你可能感兴趣的文章
项目机器在开机器的时候做好标签,汉字标注
查看>>
expr判断整数是相加的值,返回命令的返回值$? 是0,但是少数情况是1,例如1 + -1 ,$? 的结果是1 ,判断要大于1最准确...
查看>>
Matplotlib
查看>>
DES 加密----笔记
查看>>
docker 运行redis
查看>>
VS2015 C#6.0 中的那些新特性(转自http://www.cnblogs.com/henryzhu/p/new-feature-in-csharp-6.html)...
查看>>
魔法森林[NOI2014]
查看>>
bzoj4002[JLOI2015]有意义的字符串
查看>>
python爬虫-抓取acg12动漫壁纸排行设置为桌面壁纸
查看>>
用QQ传dll文件,你可能会遇到灵异事件
查看>>
hbase meta表的结构
查看>>
2017-2-10
查看>>
Git
查看>>
centos7.4 安装后的基本设置
查看>>
SQLCipher 配置
查看>>
函数的定义、作用域、函数递归
查看>>
纯手工 css+html 简易三级导航栏(横向)
查看>>
个人码风
查看>>
基于昨天调代码的收获
查看>>
iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
查看>>