栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

策略的概念(什么是策略)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

策略的概念(什么是策略)

一、策略模式

1.策略模式是一种定义一系列算法的方法,所有算法完成的都是相同的工作,只是实现不同,策略模式可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。(简单一点,替换掉if/else/switch)

2.优点:

    简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。 -符合开闭原则,扩展性好,便于维护。避免使用多重条件判断

3.缺点:

    策略如果很多,会造成策略类膨胀。使用者必须清楚所有的策略类及用途。

二、实例:商场收银软件
UML图:

package DHSJ_clms;

public abstract class CashSuper {
	public abstract double acceptCash(double money);
}

package DHSJ_clms;

public class CashNormal extends CashSuper {

	@Override
	public double acceptCash(double money) {
		return money;//原价
	}

}

package DHSJ_clms;

public class CashRebate extends CashSuper {

	private double moneyRebate;//折扣
	public CashRebate(String moneyRebate) {
		this.moneyRebate = Double.parseDouble(moneyRebate);
	}

	@Override
	public double acceptCash(double money) {
		return money*moneyRebate;
	}

}

package DHSJ_clms;

public class CashReturn extends CashSuper {

	private double moneyCondition;//满多少
	private double moneyReturn;//减多少钱
	//合起来就是满n钱时减m钱,如满300减100
	
	public CashReturn(String moneyCondition, String moneyReturn) {
		this.moneyCondition = Double.parseDouble(moneyCondition);
		this.moneyReturn = Double.parseDouble(moneyReturn);
	}

	@Override
	public double acceptCash(double money) {
		double result=money;
		if(money>=moneyCondition)
			result=money-Math.floor(money/moneyCondition)*moneyReturn;
		return result;//原价-返利值
	}

}

注意:下面的CashContext可以有两种方法实现:
法1:策略模式

package DHSJ_clms;

public class CashContext {
	private CashSuper cashsuper;
	public CashContext(CashSuper cashsuper)
	{
		this.cashsuper=cashsuper;
	}
	public double GetResult(double money)
	{
		return cashsuper.acceptCash(money);
	}
}

package DHSJ_clms;

public class Test {

	public static void main(String[] args) {
		
		String type="打8折";
		CashContext cc = null;
		switch(type)
		{
		case "正常收费":
			cc=new CashContext(new CashNormal());//默认有无参的构造函数
			break;
		case "满300返100":
			cc=new CashContext(new CashReturn("300","100"));
			break;
		case "打8折":
			cc=new CashContext(new CashRebate("0.8"));
			break;
		}
		double totalPrices=0;
		totalPrices=cc.GetResult(100)*10;
		System.out.println("合计:"+totalPrices);
	}

}

法2:策略模式+简单工厂模式

package DHSJ_clms;

public class CashContext {
	private CashSuper cashsuper;
	public CashContext(String type)
	{
		switch(type)
		{
		case "正常收费":
			cashsuper=new CashNormal();//默认有无参的构造函数
			break;
		case "满300返100":
			cashsuper=new CashReturn("300","100");
			break;
		case "打8折":
			cashsuper=new CashRebate("0.8");
			break;
		}
	}
	public double GetResult(double money)
	{
		return cashsuper.acceptCash(money);
	}
}

package DHSJ_clms;

public class Test {

	public static void main(String[] args) {
		
		CashContext cc=new CashContext("打8折");
		double totalPrices=0;
		totalPrices=cc.GetResult(100)*10;
		System.out.println("合计:"+totalPrices);
		CashContext cp=new CashContext("正常收费");
		totalPrices+=cp.GetResult(100);
		System.out.println("合计:"+totalPrices);
	}
}

法1在客户端判断用哪一种算法,不好。
法2的CashContext类仍用到了switch,也不好,但可以用反射解决。(我学会了再重写一遍)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/776790.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号