策略模式
策略模式就是,有一组算法,将每个算法都封装起来,并且使它们之间可以互换。其实就是利用了面向对象的多态和继承。
栗子:
话说刘备去东吴娶亲,诸葛亮给了赵云一组妙计(一共有三个),赵云应该关注的是问锦囊拿妙计就行了。
- 妙计对应
IStreategy
,一个实现类对应一个策略 - 锦囊对应
Context
,用来存放妙计 - 赵云关注的是
context
,可以通过Context来自由切换妙计
看代码实现:
IStrategy:
public interface IStrategy {
public void operate();
}
BackDoor:
public class BackDoor implements IStrategy{
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施压!");
}
}
BlockEnemy
public class BlockEnemy implements IStrategy{
public void operate() {
System.out.println("孙夫人断后,挡住追兵!");
}
}
GivenGreenLight
public class GivenGreenLight implements IStrategy{
public void operate() {
System.out.println("求吴国太开绿灯,放行!");
}
}
Context
public class Context {
private IStrategy strategy;
public Context(IStrategy strategy) {
this.strategy = strategy;
}
public void operate(){
this.strategy.operate();
}
}
ZhaoYun
public class ZhaoYun {
public static void main(String[] args) {
System.out.println("刚刚到吴国的时候就使用第一条妙计!");
Context context = new Context(new BackDoor());
context.operate();
System.out.println("刘备乐不思蜀了,就使用第二条妙计!");
context = new Context(new GivenGreenLight());
context.operate();
System.out.println("孙权有追兵的时候,就使用第三条妙计!");
context = new Context(new BlockEnemy());
context.operate();
}
}
如果不使用策略模式的话可以这样实现:
public class Context {
private String strategy;
public Context(String strategy) {
this.strategy = strategy;
}
public void operate(){
if("BackDoor".equals(strategy)){
System.out.println("找乔国老帮忙,让吴国太给孙权施压!");
}else if("GivenGreenLight".equals(strategy)){
System.out.println("求吴国太开绿灯,放行!");
}else if("BlockEnemy".equals(strategy)){
System.out.println("孙夫人断后,挡住追兵!");
}
}
}
public class ZhaoYun {
public static void main(String[] args) {
System.out.println("刚刚到吴国的时候就使用第一条妙计!");
Context context = new Context("BackDoor");
context.operate();
System.out.println("刘备乐不思蜀了,就使用第二条妙计!");
context = new Context("GivenGreenLight");
context.operate();
System.out.println("孙权有追兵的时候,就使用第三条妙计!");
context = new Context("BlockEnemy");
context.operate();
}
}
不使用策略模式我们可以使用if-else逻辑代替,但是如果if-else中的算法比较复杂的时候,if-else就会写的相当臃肿,可读性比较差。
小结:
策略模式的
优点:
1. 算法可以自由切换
2. 避免使用多重条件判断
3. 良好的扩展性
缺点:
1. 策略类泛滥
2. 所有的策略类都需要对外暴露 (妙计要对赵云暴露,他要知道锦囊中有哪些妙计)