今天跟同事聊天的时候,聊到了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{
@Override
public void Q() {
System.out.println("致盲你的眼睛");
}
@Override
public void W() {
System.out.println("小莫快跑");
}
@Override
public void E() {
System.out.println("毒气银针");
}
@Override
public void R() {
System.out.println("埋蘑菇");
}
@Override
public void D() {
System.out.println("治疗");
}
@Override
public void F() {
System.out.println("闪现");
}
}
这时候,在创建一个英雄蛮王。
package com.choe.interfaces.impl;
import com.choe.interfaces.IRole;
/**
* 蛮王
* @author Administrator
*
*/
public class ManWang implements IRole{
@Override
public void Q() {
System.out.println("化愤怒为血");
}
@Override
public void W() {
System.out.println("叫鸡");
}
@Override
public void E() {
System.out.println("旋风斩");
}
@Override
public void R() {
System.out.println("五秒真男人");
}
@Override
public void D() {
System.out.println("疾走");
}
@Override
public 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 {
@Override
public void D() {
System.out.println("疾走");
}
}
package com.choe.interfaces.impl;
import com.choe.interfaces.IDSkill;
public class IDSkillImpl2 implements IDSkill {
@Override
public 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 {
@Override
public void F() {
System.out.println("传送");
}
}
package com.choe.interfaces.impl;
import com.choe.interfaces.IFSkill;
public class IFSkillImpl2 implements IFSkill {
@Override
public 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;
@Override
public void Q() {
System.out.println("致盲你的眼睛");
}
@Override
public void W() {
System.out.println("小莫快跑");
}
@Override
public void E() {
System.out.println("毒气银针");
}
@Override
public 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;
}
@Override
public void D() {
dSkill.D();
}
@Override
public 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;
@Override
public void Q() {
System.out.println("化愤怒为血");
}
@Override
public void W() {
System.out.println("叫鸡");
}
@Override
public void E() {
System.out.println("旋风斩");
}
@Override
public 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;
}
@Override
public void D() {
dSkill.D();
}
@Override
public 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();
}
}
策略模式就到这了。初写博客,写的不好欢迎指正!