【Java设计模式】策略设计模式
最近看了一点设计模式,文章例子是来自HeadFirst中的。
我们假设一种场景:在一个游戏中有多种角色,每个角色只能使用一种武器,但是可以切换武器,这个场景需要怎么设计呢?
策略设计模式:它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地处理算法的切换 。
哇,这个概念真的好长,我一看就头疼。。。
其实我们在做面向接口编程的时候就是用到了策略模式!
UML类图:
每个具体人物继承或者实现了一个抽象类或接口。角色持有一个武器的接口引用,当我们需要给角色换武器的时候,我们只需要给角色里的接口引用传入不同的实现类就行了,而我们的代码并不需要改变。这就是一种把变化的部分和不变的部分分离开的思想。
下面我们来看一下代码的实现:首先我们创建一个角色的抽象类
package design.pattern.strategic;
/**
* @author Lion
* @since 2018/4/24 11:58
* 角色类
*/
public abstract class AbstractCharacter {
private WeaponBehavior weaponBehavior;
public void setWeaponBehavior(WeaponBehavior weaponBehavior) {
this.weaponBehavior = weaponBehavior;
}
public WeaponBehavior getWeaponBehavior() {
return weaponBehavior;
}
/**
* 每种武器有不同的攻击方式
* */
abstract void fight();
}
然后创建我们的角色:
King.class
package design.pattern.strategic;
/**
* @author Lion
* @since 2018/4/24 12:55
*/
public class King extends AbstractCharacter {
@Override
void fight() {
getWeaponBehavior().userWeapon();
}
}
Queen.class
package design.pattern.strategic;
/**
* @author Lion
* @since 2018/4/24 12:55
*/
public class Queen extends AbstractCharacter {
@Override
void fight() {
getWeaponBehavior().userWeapon();
}
}
创建我们的武器接口:
package design.pattern.strategic;
/**
* @author Lion
* @since 2018/4/24 11:54
* 武器策略接口
*/
public interface WeaponBehavior {
/**
* 使用武器
* */
void userWeapon();
}
创建具体的武器对象:
package design.pattern.strategic;
/**
* @author Lion
* @since 2018/4/24 12:01
* 大宝剑策略
*/
public class SwordBehavior implements WeaponBehavior {
@Override
public void userWeapon() {
System.out.println("大宝剑!!!");
}
}
package design.pattern.strategic;
/**
* @author Lion
* @since 2018/4/24 12:01
* 匕首策略
*/
public class KnifeBehavior implements WeaponBehavior {
@Override
public void userWeapon() {
System.out.println("小匕首。。。");
}
}
运行一下:
public static void main(String[] args) {
//王
King king = new King();
king.setWeaponBehavior(new SwordBehavior());
king.fight();
//后
Queen queen = new Queen();
queen.setWeaponBehavior(new KnifeBehavior());
queen.fight();
}
由于我们传入的武器对象不一样,所以两个人物的行为不一样。
还没有评论,来说两句吧...