首页 > 技术文章 > 设计模式(策略模式)

jiangyaxiong1990 2018-06-27 02:57 原文

什么是策略模式:

  策略模式是用来封装算法的,但是在实际使用中可以用它来封装任何类型的规则。只要在分析过程中发现“需要在不同时间应用不同的业务规则”就可以考虑使用策略模式;

策略模式的优点:

  策略模式简化了单元测试,因为每个算法都有自己独立的类,可以通过自己的接口单独测试;

策略模式的应用场景,以下引自百度百科:

  1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
  2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
  3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

 

文章Demo借鉴《大话设计模式》

1. 商城收银系统

public double totlaPrice(double price, int num){
  return price * num;
}

 

2. 增加打折

/**
 * 现金收费抽象类
 */
public abstract class CashSuper {
	public abstract double acceptCash(double price, int num);
}
/**
 * 正常收费
 */
public class CashNomal extends CashSuper {

	@Override
	public double acceptCash(double price, int num) {
		return price * num;
	}

}
/**
 * 打折收费
 */
public class CashRebate extends CashSuper {
	
	private double rebate = 1d;
	public CashRebate(double rebate) {
		this.rebate = rebate;
	}

	@Override
	public double acceptCash(double price, int num) {
		return price * num * rebate;
	}

}
/**
 * 返利收费
 */
public class CashReturn extends CashSuper {
	
	//条件
	private double condititon = 0.0d;
	
	//返款
	private double cashReturn = 0.0d;
	
	public CashReturn(double condititon, double cashReturn)         
        {
		this.condititon = condititon;
		this.cashReturn = cashReturn;
	}

	@Override
	public double acceptCash(double price, int num) {
		double money = price * num;
		if(money > condititon){
			//购物满300返100 eg: 1000-1000/300*100
			money = money - money/condititon*cashReturn;
		}
		return money;
	}
	
} 

 

简单工厂:

public class FactoryPattern {
	
	public static CashSuper createCashAccept(String type){
		CashSuper cs = null;
		
		switch (type) {
			case "nomal":
				cs = new CashNomal();
				break;
			case "rebate":
				cs = new CashRebate(0.8);
				break;
			case "return":
				cs = new CashReturn(300, 100);
				break;
			default:
				break;
			}
		return cs;
		
	}
	
	public static void main(String[] args) {
		
		CashSuper cs = createCashAccept("nomal");
		double result = cs.acceptCash(80, 10);
		System.out.println(result);
	}
}

 

策略模式:

public class StrategyPattern {
	
	CashSuper cs = null;
	public StrategyPattern(CashSuper cs) {
		this.cs = cs;
	}
	
	public double CashInterface(double price, int num){
		return cs.acceptCash(price, num);
	}

	public static void main(String[] args) {
		StrategyPattern sp = new StrategyPattern(new CashNomal());
		System.out.println(sp.CashInterface(80, 10));
		
		StrategyPattern sp1 = new StrategyPattern(new CashRebate(0.8));
		System.out.println(sp1.CashInterface(80, 10));
	}
}

 

策略模式+简单工厂

public class FactoryAndStrategyPattern {

	CashSuper cs = null;
	public FactoryAndStrategyPattern(String type) {
		switch (type) {
			case "nomal":
				this.cs = new CashNomal();
				break;
			case "rebate":
				this.cs = new CashRebate(0.8);
				break;
			case "return":
				this.cs = new CashReturn(300, 100);
				break;
			default:
				break;
			}
	}
	
	public double CashInterface(double price, int num){
		return cs.acceptCash(price, num);
	}

	public static void main(String[] args) {
		FactoryAndStrategyPattern sp = new FactoryAndStrategyPattern("nomal");
		System.out.println(sp.CashInterface(80, 10));
		
		FactoryAndStrategyPattern sp1 = new FactoryAndStrategyPattern("rebate");
		System.out.println(sp1.CashInterface(80, 10));
	}
	
}

  

推荐阅读