策略模式-StrategyMode

来源:互联网 发布:js获取本周第一天日期 编辑:程序博客网 时间:2024/04/30 13:46

     今天跟同事聊天的时候,聊到了java的设计模式,自己完全没弄过,真是尴尬,一脸蒙蔽。不过说实在的,做java android 的不学学设计模式,也都不好意思自己是做java的。其实吧,设计模式真的很重要,是技术提升的毕竟之道,好了闲话不多说,就记录一下自己的学习理解心德吧。

设计模式的出现,都是源于程序员的惰性,偷懒促进了设计模式的出现。今天学习了策略模式,何为策略模式,策略模式又称算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。看文字还是很难懂吧? 还是上代码来解释。

拿时下流行的英雄联盟来举个例子,英雄联盟中有128个英雄(应该是这么多吧?不管了。。),每个英雄拥有QWER四个英雄技能,还有两个召唤师技能。下面我们来构造每个英雄,先写一个接口,IRole 如下:

/** * 角色都具有的技能 * @author Administrator * */public interface IRole {void Q();    void W();     void E();    void R(); void D();void F();}

下面先创建一个提莫,

package com.choe.interfaces.impl;import com.choe.interfaces.IRole;public class Temo implements IRole{@Overridepublic void Q() {System.out.println("致盲你的眼睛");}@Overridepublic void W() {System.out.println("小莫快跑");}@Overridepublic void E() {System.out.println("毒气银针");}@Overridepublic void R() {System.out.println("埋蘑菇");}@Overridepublic void D() {System.out.println("治疗");}@Overridepublic void F() {System.out.println("闪现");}}

这时候,在创建一个英雄蛮王。

package com.choe.interfaces.impl;import com.choe.interfaces.IRole;/** * 蛮王 * @author Administrator * */public class ManWang implements IRole{@Overridepublic void Q() {System.out.println("化愤怒为血");}@Overridepublic void W() {System.out.println("叫鸡");}@Overridepublic void E() {System.out.println("旋风斩");}@Overridepublic void R() {System.out.println("五秒真男人");}@Overridepublic void D() {System.out.println("疾走");}@Overridepublic void F() {System.out.println("闪现");}}
 这时候你会发现,在召唤师技能的部分,闪现这个技能重复了。 如果对局中是个英雄都带了闪现,闪现这个技能的实现代码就需要写十遍。当然在这种情况下,只需要十遍,若是在其他的场景中就会存在需要千万遍的代码重复书写。这时候策略模式的优势就体现出来了,把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。还是老规矩看我们最熟悉的代码来解释:

首先定义D、F技能对应的接口,

package com.choe.interfaces;public interface IDSkill {void D();}

package com.choe.interfaces;public interface IFSkill {void F();}

分别实现D、F技能对应的技能,为了举例演示就之写部分(当然,在这里这种模式不是最优的解决办法,只是为了说明策略模式)

package com.choe.interfaces.impl;import com.choe.interfaces.IDSkill;public class IDSkillImpl1 implements IDSkill {@Overridepublic void D() {System.out.println("疾走");}}


package com.choe.interfaces.impl;import com.choe.interfaces.IDSkill;public class IDSkillImpl2 implements IDSkill {@Overridepublic void D() {System.out.println("治疗");}}

package com.choe.interfaces.impl;import com.choe.interfaces.IDSkill;import com.choe.interfaces.IFSkill;public class IFSkillImpl1 implements IFSkill {@Overridepublic void F() {System.out.println("传送");}}

package com.choe.interfaces.impl;import com.choe.interfaces.IFSkill;public class IFSkillImpl2 implements IFSkill {@Overridepublic void F() {System.out.println("闪现");}}

下面再来实现一个蛮王,一个timo

package com.choe.interfaces.impl;import com.choe.interfaces.IDSkill;import com.choe.interfaces.IFSkill;import com.choe.interfaces.IRole;public class Temo2 implements IRole{private IDSkill dSkill;private IFSkill fSkill;@Overridepublic void Q() {System.out.println("致盲你的眼睛");}@Overridepublic void W() {System.out.println("小莫快跑");}@Overridepublic void E() {System.out.println("毒气银针");}@Overridepublic void R() {System.out.println("埋蘑菇");}public IDSkill getdSkill() {return dSkill;}public void setdSkill(IDSkill dSkill) {this.dSkill = dSkill;}public IFSkill getfSkill() {return fSkill;}public void setfSkill(IFSkill fSkill) {this.fSkill = fSkill;}@Overridepublic void D() {dSkill.D();}@Overridepublic void F() {fSkill.F();}}

再来实现一个蛮王,

package com.choe.interfaces.impl;import com.choe.interfaces.IDSkill;import com.choe.interfaces.IFSkill;import com.choe.interfaces.IRole;/** * 蛮王 * @author Administrator * */public class ManWang2 implements IRole{private IDSkill dSkill;private IFSkill fSkill;@Overridepublic void Q() {System.out.println("化愤怒为血");}@Overridepublic void W() {System.out.println("叫鸡");}@Overridepublic void E() {System.out.println("旋风斩");}@Overridepublic void R() {System.out.println("五秒真男人");}public IDSkill getdSkill() {return dSkill;}public void setdSkill(IDSkill dSkill) {this.dSkill = dSkill;}public IFSkill getfSkill() {return fSkill;}public void setfSkill(IFSkill fSkill) {this.fSkill = fSkill;}@Overridepublic void D() {dSkill.D();}@Overridepublic void F() {fSkill.F();}}

这时候你会发现,蛮王提莫的实体类中,不涉及具体的召唤师技能了,这样在选择英的时候不会因为带的召唤师技能不能而写很多个实体,在换召唤师技能后,只需在实例化的时候传入不同的实现类,此外,这样写的代码,也复用了召唤师技能的代码。

下面看调用:

import com.choe.interfaces.impl.IDSkillImpl1;import com.choe.interfaces.impl.IDSkillImpl2;import com.choe.interfaces.impl.IFSkillImpl2;import com.choe.interfaces.impl.ManWang;import com.choe.interfaces.impl.ManWang2;import com.choe.interfaces.impl.Temo;import com.choe.interfaces.impl.Temo2;public class Main {/** * @param args */public static void main(String[] args) { Temo temo = new Temo();temo.Q();temo.W();temo.E();temo.D();temo.F();System.out.println("-------------------分割线-------------------------");ManWang manWang = new ManWang();manWang.Q();manWang.W();manWang.E();manWang.D();manWang.F();System.out.println("-------------------分割线-------------------------");Temo2 temo2 = new Temo2();temo2.setdSkill(new IDSkillImpl2());temo2.setfSkill(new IFSkillImpl2());temo2.Q();temo2.W();temo2.E();temo2.D();temo2.F();System.out.println("-------------------分割线-------------------------");ManWang2 manwang2 = new ManWang2();manwang2.setdSkill(new IDSkillImpl1());manwang2.setfSkill(new IFSkillImpl2());manwang2.Q();manwang2.W();manwang2.E();manwang2.D();manwang2.F();}}
 策略模式就到这了。初写博客,写的不好欢迎指正!


0 0