策略模式-StrategyMode


      今天跟同事聊天的时候,聊到了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();
	}

}
 策略模式就到这了。初写博客,写的不好欢迎指正!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值