1、概念
定义一组算法,并将每个算法封装起来,使得他们之间可以相互转换
2、类型:行为型模式
3、简介
策略模式是对算法的封装,就是一个算法对应一个类,这个算法类实现统一的接口,相互之间可以相互替换。模板模式也是对一个算法进行封装,但是策略模式和模板模式的区别在于仅仅多实现一个单独的封装类。
4、结构
1)封装类:也叫上下文,对策略进行二次封装,目的是为了避免高层模块对策略的直接调用
2)抽象策略:通常为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这部分公共代码。
3)具体策略:通常由一组封装了算法的类来担任,这些类可以根据需要自由转换。
5、适用场景和优点
1)几个类主要逻辑相同,只有部分逻辑的算法和行为稍微有区别的情况。
2)有几种相似的行为,或者说算法,客户端需要动态的决定使用哪种,那么可以使用策略模式,将这些算法封装起来给客户端调用。
6、原码解读
1)抽象策略接口
package com.jxau.ruanjian1201.Pattern.Strategy;
public interface Strategy {
public void show();
}
2)具体策略类
package com.jxau.ruanjian1201.Pattern.Strategy;
public class SpecificStrategy implements Strategy{
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("我是策略一");
}
}
package com.jxau.ruanjian1201.Pattern.Strategy;
public class SpecificStrategy2 implements Strategy{
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("我是策略二");
}
}
package com.jxau.ruanjian1201.Pattern.Strategy;
public class StrategyContext {
private Strategy strategy;
public StrategyContext(Strategy strategy){
this.strategy = strategy;
}
public void excute(){
strategy.show();
}
}
4)测试
package com.jxau.ruanjian1201.Pattern.Strategy;
public class Test {
public static void main(String[] args) {
StrategyContext strategyContext = null;
System.out.println("执行策略一");
strategyContext = new StrategyContext(new SpecificStrategy());
strategyContext.excute();
System.out.println("执行策略二");
strategyContext = new StrategyContext(new SpecificStrategy2());
strategyContext.excute();
}
}
5)测试结果