策略模式:说白了,就是将一组算法封装起来,使他们可以互换。
package 策略模式;
public class StrategePattern {
/**
* 抽象策略角色
* @author zouxiang
*
*/
public static interface MainMethod{
public void method();
}
public static class Method01 implements MainMethod{
@Override
public void method() {
// TODO 自动生成的方法存根
System.out.println("Method01's method");
}
}
public static class Method02 implements MainMethod{
@Override
public void method() {
// TODO 自动生成的方法存根
System.out.println("Method02's method");
}
}
/**
* 环境角色,持有抽象策略的引用
* @author zouxiang
*
*/
public static class context{
private MainMethod main = null;
public context(MainMethod main){
this.main = main;
}
public void execMethod(){ //隐式调用方法
main.method();
}
}
/**
* 结合简单工厂模式,将子类实例化交给工厂
* @author Administrator
*
*/
public static class contextFactory{
private MainMethod main = null;
public contextFactory(String type){
switch (type) {
case "method01":
main = new Method01();
break;
case "method02":
main = new Method02();
break;
default:
break;
}
}
public void execMethod(){ //隐式调用方法
main.method();
}
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
//用策略模式原始方式调用方法
new context(new Method01()).execMethod();
new context(new Method02()).execMethod();
//用工厂模式的方案去调用方法
String type1 = "method01";
String type2 = "method02";
new contextFactory(type1).execMethod();
new contextFactory(type2).execMethod();
}
}
Method01's method
Method02's method
Method01's method
Method02's method
策略模式好处:
1,恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
2,使用策略模式可以避免使用多重条件(if-else)语句。
策略模式劣势:
1,策略模式只适用于客户端知道算法或行为的情况。
2,由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。