关于策略模式
策略模式定义了算法族,分别封装起来,让它们之间可以互相调用,让算法的变化独立于使用算法的客户。
这个模式涉及到三个角色:
● 环境(Context)角色:持有一个Strategy的引用。
● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
大话策略模式
最近国庆放假,一直在和同学在王者峡谷玩耍,玩过王者荣耀的应该都知道,每个英雄可以带一个召唤师技能。我们用策略模式来解释就是:英雄对应环境角色(Context),召唤师技能对应抽象策略角色(Strategy),那么具体策略角色就是对应召唤师技能的作用,如闪现,治疗,惩戒等
- 环境角色: 英雄
public class Hero {
//持有一个召唤师技能的对象
private Technique technique;
/**
* 构造函数,传入一个具体策略对象
* @param technique 指定的召唤师技能
*/
public Hero(Technique technique){
this.technique= technique;
}
/**
* 使用召唤师技能
*/
public void useTechnique(){
technique.myTechnique();
}
}
- 抽象策略:召唤师技能
//召唤师技能是一个接口,所有的具体技能都实现该接口
public interface Technique {
/**
* 策略方法
* 技能
*/
public void myTechnique();
}
- 具体策略:闪现,治疗,惩戒
//闪现
public class Flash implements Technique{
@Override
public void myTechnique() {
//使用召唤师技能
System.out.println("我要闪现了");
}
}
//治疗
public class Treatment implements Technique{
@Override
public void myTechnique() {
//使用召唤师技能
System.out.println("我要使用治疗了");
}
}
- 具体使用场景:
如:当小亮挑选的英雄选择闪现作为召唤师技能时
//小亮选了个鲁班,带的技能是闪现
Hero luban = new Hero(new Flash());
//使用技能
luban.useTechnique();
最后代码输出我要闪现了
策略模式解析
由上面例子可以知道,每个英雄携带的召唤师技能不是固定的,而是动态分配的。也就是说具体策略并不是和环境角色一一对应的,而情况而改变。这就是对算法的封装,针对不同的用户采取不同的策略。
资料
[1]《JAVA与模式》之策略模式
[1] HeadFirst 设计模式