设计模式学习笔记之策略模式(Java实现)

package pattern_test.strategy_pattern;

/**
 * 策略接口,也可以叫做算法的抽象
 * @author glogo
 *
 */
public interface Strategy {

	/**	算法内容,从一组数据中挑出一个*/
	int pickUp(int...data);
}
package pattern_test.strategy_pattern;

/**
 * Context接口
 * @author glogo
 */
public interface Context {

	/** 注入策略对象*/
	Context setStrategy(Strategy strategy);
	
	/** 从一组数据中查找*/
	int find(int...data);	//int...data 可变参数列表
	//调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中一数组的形式访问可变参数
}
package pattern_test.strategy_pattern;

/**
 * 决策者
 * @author glogo
 *
 */
public class Selector implements Context{

	private Strategy strategy;
	@Override
	public Context setStrategy(Strategy strategy) {
		this.strategy = strategy;
		return this;
	}

	@Override
	public int find(int... data) {
		return strategy.pickUp(data);	//这里涉及到向下转型
	}

}
package pattern_test.strategy_pattern;

/**
 * 具体策略的实现者
 * @author glogo
 *
 */
public class GetMaxStrategy implements Strategy{

	@Override
	public int pickUp(int... data) {
		int min = data[0];
		for(int i = 1; i <data.length; i++)
			if(min>data[i])
				min=data[i];
		return min;
	}
}
package test;

import static org.junit.Assert.*;

import org.junit.Test;

import pattern_test.strategy_pattern.Context;
import pattern_test.strategy_pattern.GetMaxStrategy;
import pattern_test.strategy_pattern.Selector;

/**
 * 测试
 * @author glogo
 *
 */
 public class GetMaxStrategyTest {

	int[] data = new int[]{5,3,7,9,1};

	@Test
	public void test() {
		Context context = new Selector();
		//向上转型
		assertEquals(1, context.setStrategy(new GetMaxStrategy()).find(data));
	}

}

简而言之就是算法的“我”做策划,“你”来决策!

关键要素:算法的抽象、不同策略的实现、决策者

代码来源于书本


你可能感兴趣的:(java,设计模式,策略模式)