大话设计模式之--策略模式

策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户

《以大话设计模式》第二章 商场促销 为例子

1:算法抽像类 支持所有算法的公共接口

/**
 * @author admin
 *	算法抽像类 支持所有算法的公共接口
 */
public abstract class CashSuper {
	/**
	 * @Title:             acceptCash
	 * @Description:     TODO
	 * @param:             @param money
	 * @param:             @return   
	 * @return:         double   
	 * @throws
	 */
	public abstract double acceptCash(double money);
}

2:正常收费算法、打折算法实现、满300 送100 算法实现

/**
 * @author admin
 *	正常收费算法
 */
public class CashNormal extends CashSuper {

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

}
/**
 * @author admin
 *	打折算法实现
 */
public class CashRebate extends CashSuper {
	
	private double moneyRebate = 1d;
	CashRebate(String moneyRebate)
	{
		this.moneyRebate = Double.parseDouble(moneyRebate);
	}
	@Override
	public double acceptCash(double money) 
	{
		
		return money*moneyRebate;
	}

}
/**
 * @author admin
 *	满300 送100 算法实现
 */
public class CashReturn extends CashSuper {
	
	private double moneyCondition = 0;
	private double moneyResult = 0;
	
	CashReturn(double moneyCondition, double moneyResult)
	{
		this.moneyCondition = moneyCondition;
		this.moneyResult = moneyResult;
	}
	@Override
	public double acceptCash(double money) 
	{
		double result = money; 
		if (money > moneyCondition) 
		{
			result = money - moneyResult;
		}
		return result;
	}

}


3:现金上下文类 根据不同选择 返回不同的计算现金策略

/**
 * @author admin
 *	现金上下文类 根据不同选择 返回不同的计算现金策略
 */
public class CashContext 
{
	private CashSuper cs;
	
	public CashContext(String type)
	{
		//简单工厂模式的一种应用
		switch (type) 
		{
		//正常收费
		case "1" :
			cs = new CashNormal();
			break;
		//满300 送100
		case "3" :
			cs = new CashReturn(300, 100);
			break;
		//打8折
		case "2" :
			cs = new CashRebate("0.8");
			break;
		}
	}
	
	/**
	 * @Title:             getResult
	 * @Description: 调用CashSuper 的 getResult方法去调用具体的算法
	 * @param:             @param money
	 * @param:             @return   
	 * @return:         double   
	 * @throws
	 */
	public double getResult(double money)
	{
		return cs.acceptCash(money);
	}
}


4:显示器类 main方法

import java.util.Scanner;

/**
 * @author admin
 *	显示器类 main方法
 */
public class CashView {

	/**
	 * @Title:             main
	 * @Description:     TODO
	 * @param:             @param args   
	 * @return:         void   
	 * @throws
	 */
	public static void main(String[] args) 
	{
		
		@SuppressWarnings("resource")
		Scanner in = new Scanner(System.in);
		System.out.println("请输入收费金额:");
		double money = Double.parseDouble(in.next());
		System.out.println("请按下面的提示输入,1 代表:正常收费。2 代表打8折。3 代表 满300送100");
		String type = in.next();
		
		CashContext cashContext = new CashContext(type);
		double resultMoney = cashContext.getResult(money);
		System.out.println("实际收费:" + resultMoney);

	}

}
5:策略模式总结
策略模式封装了变化

你可能感兴趣的:(大话设计模式)