关于设计模式之策略模式
来源:互联网 发布:微博怎么链接淘宝商品 编辑:程序博客网 时间: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、多用组合,少用继承。
设计模式真的是非常重要,也希望自己能好好消化多种设计模式之中的内涵!
- 关于设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- EAP和EAPOL资料
- hdu 1811 Rank of Tetris
- Android Bug
- js中json字符串与json互转
- 翼支付门户架构之spring security之自定义登陆页面
- 关于设计模式之策略模式
- Inno Setup Preprocessor: Directives
- android四大组件总结
- openstack ice resize 详解(三)
- 【平衡二叉树】SBT学习笔记
- LeetCode[Linked List]: Linked List Cycle II
- eclipse快捷键使用
- spring mvc DispatcherServlet详解之前传---FrameworkServlet
- linux 串口驱动(三)