策略模式:
策略模式是行为对象模式,主要是定义一系列算法,把每个算法封装起来,此模式让算法的变化独立于使用算法的客户。
策略模式体现了两个面向对象编程原则:
1、封装变化的概念
2、编程中使用接口,而不是对接口的实现
策略模式定义一个共同的抽象算法接口,其子类实现这个接口定义的方法,并且都有各自不同的实现,这些算法实现可以再客户端调用它们的时候互不影响的变化。子算法之间是弱连接。
策略模式组成:
1、抽象策略角色:策略类,通常由一个接口或者抽象类实现
2、具体策略角色:包括相关算法和行为,可能不止一个具体策略角色
3、环境角色:持有一个策略类的引用,最终给客户端调用的。
策略模式编写步骤:
1、对一组算法抽象出一个共同接口,定义这个共同接口
2、编写策略类,实现这个接口,每个策略类都有其独特的实现
3、编写环境角色类,类中持有一个共同接口的引用,对策略对象注入如set方法和get方法或者构造方法完成赋值。
例子:
//策略类
package cn.itcast.strategy;
public interface StrategyHander {
public void hander(Object obj);
}
//具体策略实现类 IntergeHander
package cn.itcast.strategy;
public class IntergeHander implements StrategyHander {
@Override
public void hander(Object obj) {
// TODO Auto-generated method stub
Integer a = (Integer)obj;
System.out.println("this is an integer:"+a);
}
}
//实现类ListHander
package cn.itcast.strategy;
import java.util.List;
public class ListHander implements StrategyHander {
@Override
public void hander(Object obj) {
// TODO Auto-generated method stub
List<Integer> list = (List<Integer>)obj;
for(Integer i: list){
System.out.println("the value is:"+i);
}
}
}
//具体策略类实现类StringHander
package cn.itcast.strategy;
public class StringHander implements StrategyHander {
@Override
public void hander(Object obj) {
// TODO Auto-generated method stub
String str = (String)obj;
System.out.println(str.toUpperCase());
}
}
//环境角色类package cn.itcast.strategy;
public class StrategyEnviroment {
private StrategyHander hander;
/**
* @return the hander
*/
public StrategyHander getHander() {
return hander;
}
/**
* @param hander the hander to set
*/
public void setHander(StrategyHander hander) {
this.hander = hander;
}
public StrategyEnviroment(StrategyHander hander){
this.hander = hander;
}
public void invoke(Object obj){
hander.hander(obj);
}
}
//测试程序package cn.itcast.strategy;
import java.util.ArrayList;
import java.util.List;
public class StratgeDemo {
public static void main(String[] args){
StringHander strHander = new StringHander();
StragterEnviroment strEnvirmonet = new StragterEnviroment(strHander);
strEnvirmonet.invoke("abc");
IntergeHander intHander = new IntergeHander();
StragterEnviroment intEnvirmonet = new StragterEnviroment(intHander);
intEnvirmonet.invoke(45);
ListHander lstHander = new ListHander();
StragterEnviroment lstEnvirmonet = new StragterEnviroment(lstHander);
List<Integer>list = new ArrayList<Integer>();
list.add(3);
list.add(4);
list.add(44);
lstEnvirmonet.invoke(list);
}
}