开门见山,不讲枯燥的定义了。
先放上一张简化类图:
其实策略模式很好理解,由三部分组成:一个策略(策略接口及其实现类),一个策略容器(通过注入策略接口对象实现对策略实现类的调用),一个使用策略的用户。
如图,右边是一个抽象接口Strategy,以及两个具体的实现类ConcreteStrategyA和ConcreteStrategyB;左边是一个context容器,有一个Strategy类型的属性;最后就是一个调用者。
下面我贴段代码,大家自己体会下。
第一部分:
IStrategy接口:
package _1st_Strategy;
public interface IStrategy {
void win();
}
以及两个实现类:
package _1st_Strategy;
public class Backhand implements IStrategy {
@Override
public void win() {
System.out.println("反拍下切急坠得分");
}
}
package _1st_Strategy;
public class Forehand implements IStrategy {
@Override
public void win() {
System.out.println("正拍穿越得分");
}
}
第二部分:容器Mind类。
package _1st_Strategy;
public class Mind {
//注入IStrategy对象,可以调用具体实现的策略。
private IStrategy strategy = null;
Mind(IStrategy strategy) {
this.strategy = strategy;
}
public void win() {
this.strategy.win();
}
}
第三部分:用户类,调用“策略”测试。
package _1st_Strategy;
public class TennisPlayer {
public static void main(String[] args) {
Mind mymind = new Mind(new Forehand());
mymind.win();//输出“正拍穿越得分”
mymind = new Mind(new Backhand());
mymind.win();//输出“反拍下切急坠得分”
}
}
最后总结下,策略模式的关键就是“策略接口对象注入容器类”。