关于设计模式之策略模式

来源:互联网 发布:微博怎么链接淘宝商品 编辑:程序博客网 时间:2024/06/11 13:01

最近一直在看设计模式的书,其中有一种策略模式,感觉十分有用,今天就来说一下。

那么关于策略模式的定义是这样的:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法独立于是用算法的客户。

看了定义之后感觉一点不懂,那么现在就举个例子:

比如说现在有一个关于使用武器的模拟游戏,游戏中的角色会使用各种武器进行攻击

如果根据传统的习惯,会在程序中设置一个角色类作为超类,超类中有攻击的方法,子类在继承超类后重写超类的方法,使用各种攻击方法,但是这种方法会使代码在多个子类中重复,且运行时行为不容易改变。

另一种方法,我们可以把各种攻击方法设置成接口,只有使用这种武器的角色才实现这些接口,不过这种方法会造成一些问题,比如:本来使用弓箭的角色后来改为使用匕首了,这么这样就要修改每一个本来使用弓箭的角色,这样会造成后续维护等各种问题。

那么现在是轮到策略模式大展身手的时候了:

我们可以把各种攻击方法设计成为一个类,每个类都实现武器行为接口,即WeaponBehavior,如KnifeBehavior、BowAndArrowBehavior、SwordBehavior、AxeBehavior,每个角色(如:King、Knight、Troll、Queen)都可实现多种攻击方式,只要使用各种不同的攻击方式类的组合即可,下面就来看看我们的代码:

定义一个武器行为的接口:

//这是一个关于武器行为的接口  所有的武器动作都必须实现这个接口
package weaponBehavior;

public interface WeaponBehavior {
 public void useWeapon();
}

再定义武器行为类:

//这是实现使用斧头劈砍的类
package weaponBehaviorAction;

import weaponBehavior.WeaponBehavior;

public class AxeBehavior implements WeaponBehavior{

 @Override
 public void useWeapon() {
  // TODO Auto-generated method stub
  System.out.println("实现了使用斧头进行劈砍!!!");
 }

}

 

//这是实现使用弓箭射击的类
package weaponBehaviorAction;

import weaponBehavior.WeaponBehavior;

public class BowAndArrowBehavior implements WeaponBehavior{

 @Override
 public void useWeapon() {
  // TODO Auto-generated method stub
  System.out.println("实现了使用弓箭进行射击!!!!");
 }

}

 

//这是实现是用匕首刺杀的类
package weaponBehaviorAction;

import weaponBehavior.WeaponBehavior;

public class KnifeBehavior implements WeaponBehavior{

 @Override
 public void useWeapon() {
  // TODO Auto-generated method stub
  System.out.println("是用了匕首进行刺杀!!!");
 }

}

 

//这是实现用宝剑挥舞的类
package weaponBehaviorAction;

import weaponBehavior.WeaponBehavior;

public class SwordBehavior implements WeaponBehavior{

 @Override
 public void useWeapon() {
  // TODO Auto-generated method stub
  System.out.println("是用了剑进行挥舞!!");
 }

}

 

再定义一个角色的超类

//这是角色的超类,所有的角色都要继承这个类
package characterAbstract;

import weaponBehavior.WeaponBehavior;

public abstract class Character {
 WeaponBehavior weaponBehavior;
 //实现使用武器进行攻击
 public void fight(){
  weaponBehavior.useWeapon();
 }
 //设置weaponBehavior已确定要进行的攻击类型
 public void setWeaponBehavior(WeaponBehavior weaponBehavior) {
  this.weaponBehavior = weaponBehavior;
 }
}

 

 

最后再通过测试类实现一个角色多种攻击动作

//测试类
package character;

import weaponBehaviorAction.AxeBehavior;
import weaponBehaviorAction.BowAndArrowBehavior;
import weaponBehaviorAction.KnifeBehavior;
import weaponBehaviorAction.SwordBehavior;
import characterAbstract.Character;

public class CharacterChild extends Character{
 public static void main(String args[]){

  Character king= new CharacterChild();
  //实现使用斧头砍
  king.setWeaponBehavior(new AxeBehavior());
  king.fight();
  //实现使用弓箭射击
  king.setWeaponBehavior(new BowAndArrowBehavior());
  king.fight();
  //实现使用匕首刺杀
  king.setWeaponBehavior(new KnifeBehavior());
  king.fight();
  //实现使用宝剑挥舞
  king.setWeaponBehavior(new SwordBehavior());
  king.fight();
 }
}

使用策略模式把一些经常需要更改的内容分离出来形成单独的类,使得超类的某些行为不用依靠自身来实现,而是交给其他具体的类来实现,这样的做法可以大大加大往后系统的维护性,而且多种组合的使用可以使系统更加具有弹性。

从以上的代码中我们也可以看到一些重要的设计原则:1、找到应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。2、针对接口编程,而不是针对实现编程。3、多用组合,少用继承。

设计模式真的是非常重要,也希望自己能好好消化多种设计模式之中的内涵!

 

0 0
原创粉丝点击