版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35165632/article/details/83537627
策略模式 :
定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
解释:该模式将基类对象的公共行为,封装起来变成类对象的某个属性,通过调用属性的固定方法,和动态设置类对象的属性,动态的使用类被封装起来的不同行为。设计模式关键字:XXXBehavior (XXX 行为)
策略模式样例演示:剑与魔法的世界。
/**
这是一套动作冒险游戏初始的设计
每个角色都只能佩戴自己的武器
进行自己独有的攻击方式
**/
// 角色类基类
public class CharacterOld{
fight(){
}
}
// 皇后类
public class QueenOld extends CharacterOld{
fight(){
//皇后用法杖
}
}
// 皇帝类
public class KingOld extends CharacterOld{
fight(){
//皇帝用宝剑
}
}
// 骑士类
public class KnightOld extends CharacterOld{
fight(){
//骑士用枪
}
}
在发展的过程中,游戏的运营人员发现这样的角色过于单一,无法搭配天赋系统发挥各个武器的长处,可玩性不足。所以下达需求需要不同的角色也可以用不同的武器进行攻击,可以让玩家自行选择。所以就引出了策略模式的使用方式。
代码如下:
/**
角色的基类
设计将武器攻击的行为进行封装
角色进行攻击时可以不关注武器的攻击是如何实现的,
只要知道自己拿了什么武器,要进行攻击就可以了。
所以就算进行武器的切换,也不要二次的开发。
即角色has用武器攻击的行为,角色not is可以攻击的类。
**/
public class Character{
// 封装武器攻击行为的接口
WeaponBehavior weapon;
// 无参的构造方法,初始化时,如果不佩戴武器则为空手攻击
public Character(){
this.weapon = new HandBehavior();
}
// 有参的构造方法,初始化时,可以对角色佩戴武器
public Character(WeaponBehavior weapon){
this.weapon = weapon;
}
// 角色的攻击方法,根据所佩戴的武器自动匹配
private fight(){
// 用武器攻击
weapon.useWeapon();
}
// 通过对封装行为的重新设置,可以改变角色的攻击方式
private setWeapon(WeaponBehavior weapon){
// 动态的设置角色的武器
this.weapon = weapon;
}
}
/**
皇后的继承类
**/
public class Queen extends Character{
// 皇后自己的行为
queenDo();
}
/**
皇帝的继承类
**/
public class King extends Character{
// 皇帝自己的行为
kingDo();
}
/**
骑士的继承类
**/
public class Knight extends Character{
// 骑士自己的行为
knightDo();
}
/**
对武器攻击行为进行封装的接口
**/
public interface WeaponBehavior{
// 使用武器进行攻击
useWeapon();
}
/**
用手攻击的实现类
**/
public class HandBehavior() implements WeaponBehavior{
@overload
public useWeapon(){
// 用手攻击的实现
}
}
/**
用弓箭攻击的实现类
**/
public class BowAndArrowBehavior() implements WeaponBehavior{
@overload
public useWeapon(){
// 用弓箭攻击的实现
}
}
/**
用斧头攻击的实现类
**/
public class AxeBehavior() implements WeaponBehavior{
@overload
public useWeapon(){
// 用斧头攻击的实现
}
}
以上就是通过使用策略模式对剑与魔法的世界进行的二次设计,保证可以复用不同武器的攻击方式,又可以动态的设置不同角色使用的武器和攻击方式,大大减少了将来进行扩展的难度。至于一些小问题,会在以后的设计模式中进行解决。