定义
策略模式(Strategy)定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
思考与理解
以勇士使用武器进行战斗这一事件为例:
使用算法的客户,可以理解为勇士,而算法族就是勇士的武器库。
武器库由一个接口和若干具体武器类组成,接口中定义一个attack()方法,而具体武器根据各自的效果实现这个attack()方法,上到霜之哀伤下到代达罗斯之殇,暴击减速等等。如果算法变化了,比如代达罗斯之殇拆成了水晶剑,其变化是被封装在对应的武器类之中的。
public interface weapon{
void attack();
}
public class Daedalus implement weapon{
@Override
void attack(){
System.out.println("critical strike");
}
}
勇士类,一把武器构造一个英雄,有4个域,一个武器的私有域,一个传入武器进行构造的构造器,一个更改武器的方法和一个战斗(调用武器的attack())的方法。
public class Brave{
private Weapon weapon;
public Brave(Weapon weapon) {this.weapon=weapon;}
public void changeWeapon(Weapon weapon) {this.weapon=weapon;}
public void goToBattle() {weapon.attack();}
}
于“我们”进行剧本的安排,在main函数中进行测试,使用任意武器构造一个勇士,并调用勇士进行攻击,最后造成的攻击效果不同。
public static void main(String[] args){
Brave brave=new Brave(new Daedalus());
brave.goToBattle();
brave.changeWeapon(new Frostmourne());
brave.goToBattle();
}
以上的过程是一个简单的策略模式的例子,将使用算法的客户与算法的变化相独立,当算法(武器)变化时,客户调用算法的方法(实际调用attack()方法)仍然不变。
在这个例子中对于将具体的实现放到了算法类中,而客户(勇士)使用时仅仅只有一个切换武器以及战斗(调用attack())接口。将变化的与不变的代码分开,体现了设计模式的封装变化,针对接口编程,不针对实现编程的原则。
平常项目中想要做到自然而然,信手拈来的将变与不变分开,需要丰富的经验和敏锐的嗅觉,努力,加油_。
参考:Head First 设计模式,github代码
网友评论