策略模式(strategy)

策略模式对应于解决某一问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法,并且由客户端选择调用哪个算法。 
本质:分离算法,选择实现。

 

下面是代码实现:

首先,创建Strategy接口:

package com.note.pattern.strategy;

public interface Strategy {

	public double getPrice(double standardPrice);

}

  

 针对接口创建不同的实现类:

// 新客户小批量购买的策略
class NewCustomerFewStrategy implements Strategy {
	@Override
	public double getPrice(double standardPrice) {
		System.out.println("不打折,原价");
		return standardPrice;
	}
}

// 新客户大批量购买的策略
class NewCustomerManyStrategy implements Strategy {
	@Override
	public double getPrice(double standardPrice) {
		System.out.println("打九折");
		return standardPrice * 0.9;
	}
}

// 老客户小批量购买策略
class OldCustomerFewStrategy implements Strategy {
	@Override
	public double getPrice(double standardPrice) {
		System.out.println("打八五折");
		return standardPrice * 0.85;
	}
}

// 老客户大批量购买策略
class OldCustomerManyStrategy implements Strategy {
	@Override
	public double getPrice(double standardPrice) {
		System.out.println("打八折");
		return standardPrice * 0.8;
	}
}

 

创建Context上下文类,用来管理算法:

package com.note.pattern.strategy;

/**
 * 负责和具体的策略类交互 这样的话,具体的算法和直接的客户端调用分离了,使得算法可以独立于客户端独立的变化。
 * 如果使用spring的依赖注入功能,还可以通过配置文件,动态的注入不同策略对象,动态的切换不同的算法.
 */
public class Context {

	private Strategy strategy; // 当前采用的算法对象

	// 可以通过构造器来注入
	public Context(Strategy strategy) {
		super();
		this.strategy = strategy;
	}

	// 可以通过set方法来注入
	public void setStrategy(Strategy strategy) {
		this.strategy = strategy;
	}

	public void pringPrice(double s) {
		System.out.println("您该报价:" + strategy.getPrice(s));
	}

}

  

客户端测试:

package com.note.pattern.strategy;

public class Client {

	public static void main(String[] args) {
		
		Strategy s1 = new OldCustomerManyStrategy();
		Context ctx = new Context(s1);

		ctx.pringPrice(998);

	}

}

  

策略模式在开发中应用场景: 
  javase中GUI编程中,布局管理; 
  Spring框架中,Resource接口,资源访问策略;

 

 

 

 

  

posted @ 2018-01-11 14:34  jianhuazhao  阅读(205)  评论(0编辑  收藏  举报