您的位置:首页 > 编程语言 > Java开发

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

2013-04-21 00:00 411 查看
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));
}

}

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

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

代码来源于书本
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息