欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

策略(Strategy)模式

程序员文章站 2022-07-13 17:17:00
...



策略模式四个字听起来很多人都可能不是很理解,其实它就是一种简单的设计模式,举个例子啊:现在很多人都喜欢打游戏,游戏中的角色我们最熟悉不过了。角色有分为很多种,不同的角色使用不同的技能或武器。其实这就包含了策略(Strategy)模式。这个设计模式其实就是抽象类与接口的使用。假如你是新手,可以一起和我这样做。

1.我们来分析一下游戏里的技能,技能就是可以造成杀伤力的东西。每个角色的技能都不同。那么我们可以把“技能”单作一个接口。

package org.lxh.dao;

public interface WeaponBehavior {
	public void useWeapon();    //使用武器
}

 

2.接口弄好了,那么实现类呢?实现类就是对这些技能的一种细化。

package org.lxh.impl;

import org.lxh.dao.WeaponBehavior;

public class SwordBehavior implements WeaponBehavior {

	public void useWeapon() {
		System.out.println("用宝剑挥舞");
	}

} 
package org.lxh.impl;

import org.lxh.dao.WeaponBehavior;

public class KnifeBehavior implements WeaponBehavior {

	public void useWeapon() {
		System.out.println("用匕首刺杀");
	}

}
package org.lxh.impl;

import org.lxh.dao.WeaponBehavior;

public class AxeBehavior implements WeaponBehavior {

	public void useWeapon() {
		System.out.println("用斧头砍劈");
	}

}


   3.之后我们可以考虑一下,其实每个角色都会发动攻击,也就是使用武器。有时可以切换武器。这些都是每个角色的共同点。不同的则是动作的执行者,基于这些特点,我们可以把“切换武器”和“攻击”写在一个抽象类里。我是这样设计的。
package org.lxh.dao;

public abstract class Character {
	WeaponBehavior weapon;
	public WeaponBehavior setWeapon(WeaponBehavior wea)   //切换武器
	{
		this.weapon=wea;
		return this.weapon;
	}
	public abstract void fight();    //角色之间的打斗或搏击
}

   4.下面的工作就简单多了,我们可以开始写每个角色的功能了。
     这段代码表示皇帝的进攻
package org.lxh.impl;

import org.lxh.dao.Character;


public class King extends Character {
	
	SwordBehavior sw = new SwordBehavior();
	KnifeBehavior knife = new KnifeBehavior();

	public void fight() {
		
		System.out.println("皇帝开始进攻:");
		setWeapon(sw).useWeapon();
		System.out.println("切换武器之后=========");
		setWeapon(knife).useWeapon();

	}
}

下面的代码则是爵士的进攻;

package org.lxh.impl;

import org.lxh.dao.Character;

public class Knight extends Character{
	
	AxeBehavior axe=new AxeBehavior();
	KnifeBehavior knife=new KnifeBehavior();
	public void fight(){
		System.out.println("爵士开始进攻:");
		setWeapon(axe).useWeapon();
		System.out.println("切换武器之后=========");
		setWeapon(knife).useWeapon();
	}
}

当然了角色还有很多,有兴趣的话可以自己添加一些角色。

5.编写测试类

package test;
import org.lxh.impl.King;
import org.lxh.impl.Knight;

public class Test {

	public static void main(String[] args) {
		King k=new King();
		Knight kt=new Knight();
		k.fight();
		kt.fight();
	}

}

下面就是运行的效果截图。

策略(Strategy)模式

好了,这就是策略模式了。如果代码有错或者有看不懂的地方,可以写评论或者通过qq和我交流,我的qq号是1214273312,加我的时候请注明“csdn网友“就可以了。我一般都在线。