java-设计模式(行为型)-【策略模式】

1.策略模式(StrategyMode)

  定义:属于java的行为型模式,遵循开闭原则(对扩展开放,对修改关闭),能有效减少面向过程的if-else语句,

           策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。  

  使用场景:适用于将不同的算法各自封装,用户端可以随意挑选需要的算法。

2.在线支付例子

某支付系统接入以下几种商户进行充值:假如分为四种,手机支付,网银支付,商户账号支付和点卡支付。

 如下:

    ①网银充值,8.5折;

    ②商户充值,9折;

    ③手机充值,没有优惠;

    ④点卡充值,收取1%的渠道费;

3.图解

4.枚举类(支付)

//四种的支付手段
public enum PayMode {
   
	BANK(1,"网银充值"),ACCOUNT(2,"商户充值"),MOBILE(3,"手机充值"),CARD(4,"点卡充值");
	private int value;
	private String mode;
	PayMode(int value,String mode)
	{
		value=value;
		mode=mode;
	}
}

5.策略类

public interface Strategy {

	 double getSum(double money);
}
//①网银充值,8.5折;
//②商户充值,9折;
//③手机充值,没有优惠;
//④点卡充值,收取1%的渠道费;
class BankStra implements Strategy
{

	@Override
	public double getSum(double money) {
		// TODO Auto-generated method stub
		return money*0.85;
	}
}
class AccountStra implements Strategy
{

	@Override
	public double getSum(double money) {
		// TODO Auto-generated method stub
		return money*0.9;
	}	
}
class MobileStra implements Strategy
{

	@Override
	public double getSum(double money) {
		// TODO Auto-generated method stub
		return money;
	}
}
class CardStra implements Strategy
{

	@Override
	public double getSum(double money) {
		// TODO Auto-generated method stub
		return money*1.01;
	}
}

  6.生产策略类的工厂(单态设计模式:已经静态保存了四种策略,保证线程同步)

//策略工厂:设计为单态模式,保持线程安全,用个池保存具体策略。
class StrategyFactory 
{   
	private static Hashtable <Integer ,Strategy> ht=new Hashtable<Integer,Strategy>();
	private static StrategyFactory factory=new StrategyFactory();
	private StrategyFactory()
	{
	}
	static{
		ht.put(1, new BankStra());
		ht.put(2,new AccountStra());
		ht.put(4,new CardStra());
		ht.put(3, new MobileStra());
	}
	public static StrategyFactory getInstance()
	{
		return factory;
	}
	public  Strategy getStrategy(int value)
	{
		 return ht.get(value);
	}
}

  7.场景类:根据用户的不同要求使用不同的策略

public class Context {

	 //计算指定支付方式的费用
	public double getReCharge(int value, double money) {
		// TODO Auto-generated method stub
		Strategy strat=StrategyFactory.getInstance().getStrategy(value);
		return strat.getSum( money);
	}
}

  8.测试

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
          Context context=new Context();
          double charge=context.getReCharge(1, 100);
          System.out.println(charge);
          double charge2=context.getReCharge(2, 100);
          System.out.println(charge2);
	}

}

  9.运行结果

85.0
90.0

  

 

 

 

 

 

 

 

  

 

posted @ 2015-04-08 12:33  beyondbycyx  阅读(166)  评论(0编辑  收藏  举报