定义:定义一系列的算法,将它们封装起来,且这些算法具有一定的相似性,通过接口访问它们时可以相互替换。
理解:就是说对于不同的策略,有不同的具体实现方法,这些具体实现方法继承自同一个接口,业务逻辑层通过接口访问具体实现方法。
几种类型的类
1.抽象策略类(具体实现的抽象接口层)
2.具体策略类(实现抽象策略类,具体实现层)
3.场景角色类(关联抽象策略类,业务逻辑层)
具体应用
1.抽象策略接口
package com.java.celv;
/**
* @author wangpei
* @version 创建时间:2017年5月7日 下午3:11:40
* 抽象策略角色
*/
public interface Strategy {
public void doThing();
}
2.具体策略类1
package com.java.celv;
/**
* @author wangpei
* @version 创建时间:2017年5月7日 下午3:34:19 鸡类
*/
public class ConcreteStrategy2 implements Strategy {
@Override
public void doThing() {
System.out.println("我可以打鸣");
}
}
3.具体策略类2
package com.java.celv;
/**
* @author wangpei
* @version 创建时间:2017年5月7日 下午3:30:21
* 猴子类,具体策略类
*/
public class ConcreteStrategy1 implements Strategy{
@Override
public void doThing() {
System.out.println("我可以爬树");
}
}
4.业务逻辑类
package com.java.celv;
/**
* @author wangpei
* @version 创建时间:2017年5月7日 下午3:35:14
* 场景角色类,对抽象策略类的调用
*/
public class Context {
public Strategy st;
public Context(Strategy st){
this.st=st;
}
public void execute(){
st.doThing();
}
public static void main(String[] args) {
ConcreteStrategy1 c1=new ConcreteStrategy1();
Context x1=new Context(c1);
x1.execute();
ConcreteStrategy2 c2=new ConcreteStrategy2();
Context x2=new Context(c2);
x2.execute();
}
}
不用策略模式时,通过if-else
package com.java.celv;
/**
* @author wangpei
* @version 创建时间:2017年5月7日 下午3:41:18
* 不用策略模式的实现
*/
public class Wucelv {
public void execute(){
if("传入的类型".equals("鸡类型"))
System.out.println("我可以打鸣");
else if("传入的类型".equals("猴子类型类型"))
System.out.println("我可以爬树");
else
System.out.println("未有改类型");
}
public static void main(String[] args) {
}
}
从上面的代码很容易看出,抽象接口类实现对底层具体实现类的底层封装,context业务逻辑层通过接口调用其具体方法。
优点
1.各策略类间可以自由切换
2.降低各类间的耦合度,避免使用太多的if-else -if连接
3.易于扩展,当增加一种策略时,只需实现继承抽象接口的策略类即可,代码修改量少。
缺点
1.随着策略的增加,需要维护过多的策略类,浪费资源。
2.客户端必知道各个策略类具体功能,然后才能应对不同的策略调用不同的策略类。
策略模式在java中的应用
1.Arrays.sort(T[], Comparator < ? super T > c)
具体看:
http://blog.csdn.net/wisgood/article/details/16541013
对于不同的策略,其实现Comparator接口对应的compare方法不同