策略模式:策略模式就是将一系列可以相互替换的算法封装起来,然后使算法独立于使用它们的角色。
玩过类Dota游戏的都知道,一个英雄(希尔瓦娜斯·风行者)可以买各种装备,现在我们简化一下,假如每个英雄身上只能带一件装备,装备放在背包中,那么就要针对不同的情况出不同的装备(假设一场比赛敌方的情况是不变的),如果对面法师多,爆发高,就出魔法免疫装备BKB,如果对面爆发不高,则选择出输出装备蝴蝶:
首先各个英雄在商店能买到的各种装备就相当于策略模式中的抽象策略角色。
其次,魔法免疫装备BKB以及蝴蝶相当于策略模式中的具体策略角色。
最后,敌方的情况(是爆发高还是不高)相当于策略模式中的环境。Context。
下面是具体的代码:
抽象策略接口,策略模式的一个组成,通常是一个接口或者是抽象类(当这些算法有某些相同的部分的时候,就要使用抽象类将同样的方法集中在这个具体策略角色中)。
策略模式注重的不是如何实现算法,而是可以将算法封装起来,便于程序的扩展和维护,这些算法是相互平等的。
public interface Equipment { public void effect();}
具体策略接口,策略模式的一个组成。
public class BKB implements Equipment{ @Override public void effect() { System.out.println("我获得了魔法免疫!"); }}public class Butterfly implements Equipment{ @Override public void effect() { System.out.println("我的输出大别多!"); }}
游戏环境Context,策略模式的一个组成。
public class Context { private Equipment equip; public Context(Equipment equip){ this.equip=equip; } public void buy(){ equip.effect(); }}
使用各种策略(algorithms)的英雄(client)。
public class Hero { //英雄使用不同的可以相互替换的武器,从而发挥不同的作用,使得装备(algorithm)独立于英雄(client) public static void main(String [] agrs){ Context context; //对面爆发高,则买BKB context = new Context(new BKB()); context.buy(); //对面爆发不高,则买蝴蝶Butterfly //context = new Context(new Butterfly()); //context.buy(); }}
最后,策略模式体现了设计模式的OCP原则,也就是对修改关闭,对扩展开放的Open Closed Principle,如果要添加不同的算法,则直接实现Equipment接口添加新的实现类就可以了。相比于使用if else控制所选的算法,用策略模式更方便与维护,但是,客户要熟悉各种策略(algorithms)才能做出相应的选择,如果策略很多,则理解各种策略会花费较长的时间。
原标题:设计模式(二)策略模式
关键词:设计模式