[设计模式] 策略模式
来源:互联网 发布:天天秒淘宝秒杀助手 编辑:程序博客网 时间:2024/06/07 05:20
定义
将同类的算法或行为分别封装成独立的类,使它们可以互相替换,让具体行为的变换独立于使用者。
说定义可能有点抽象,来看个例子比较直观。
简单的例子
现在要实现一款RPG游戏:
1. 游戏有多个角色,每个角色都有基本的攻击技能。
2. 设计了多款武器,武器攻击的效果不一。
3. 人设可以设定和更换武器来攻击。
使用策略模式来实现:
1. 定义一个武器接口,各款武器都实现这个接口并定义自己的攻击行为。
2. 定义一个角色的超类,拥有一个武器接口实现类的成员变量,并有设置武器的方法。
定义武器攻击行为的接口:
public interface WeaponBehavior { public void attack();}
实现用长剑,匕首和斧头的攻击行为:
public class SwordBehavior implements WeaponBehavior { @Override public void attack() { System.out.println("Sword Attack, HP -20"); }}public class KnifeBehavior implements WeaponBehavior { @Override public void attack() { System.out.println("Knife Attack, HP -5"); }}public class AxeBehavior implements WeaponBehavior { @Override public void attack() { System.out.println("Axe Attack, HP -50"); }}
然后定义角色的抽象基类:
public abstract class Character { WeaponBehavior mBehavior; //武器行为 public void performAttack(){ if(mBehavior != null) mBehavior.attack(); //使用设置的武器来实现攻击 else System.out.println("Character doesn't have weapon yet"); } //设置具体的武器 public void setmBehavior(WeaponBehavior mBehavior) { this.mBehavior = mBehavior; }}
先设计2个角色:骑士和国王
public class Knight extends Character { public Knight() { //骑士的默认武器是长剑 setmBehavior(new SwordBehavior()); }}public class King extends Character { public King() { setmBehavior(new KnifeBehavior()); //国王标配小刀 }}
开始攻击(没有敌人,只能攻击空气):
public static void main(String[] args) { Character knight = new Knight(); knight.performAttack(); //骑士先用长剑将空气劈倒 Character king = new King(); king.performAttack(); //躲在后面的国王,趁机上前捅了一刀 king.setmBehavior(new AxeBehavior()); //没捅死,急于抢人头的国王换上骑士递过来的斧头 king.performAttack(); //一顿怒砍,空气终于死了 }
本来只有30血的空气君这下被爆了75点血。。。
Sword Attack, HP -20Knife Attack, HP -5Axe Attack, HP -50
小结
如上面的简单例子,武器的行为可以自由地在角色间切换,其实现完全独立于角色,如果后面需要加入新的角色和武器,那么目前已经实现的类将不用进行改动。
阅读全文
0 0
- 设计模式-策略模式
- 设计模式:策略模式
- 设计模式-策略模式
- 设计模式 - 策略模式
- 设计模式-策略模式
- 设计模式-----策略模式
- 设计模式 策略模式
- 设计模式-策略模式
- 设计模式-【策略模式】
- 设计模式-----策略模式
- 设计模式-策略模式
- 设计模式--策略模式
- 设计模式- 策略模式
- 设计模式- 策略模式
- 设计模式------策略模式
- 设计模式--策略模式
- 设计模式-策略模式
- 设计模式--策略模式
- Java之垃圾回收
- 【C语言】函数运行过程-----栈帧调用
- 浏览器中的data类型的Url格式,data:image/png,data:image/jpeg! 收藏 苏生不惑 发表于 4年前 阅读 3943 收藏 3 点赞 0 评论 0 腾讯云·
- WP博客使用RevolverMaps
- java发展历程、常用dos命令与jDK工具使用
- [设计模式] 策略模式
- 某知名公司的两道sql面试题
- undefined function curl_init()
- MYSQL联合多表更新和删除
- 简谈servlet
- 【MySQL】创建普通用户,分配权限,取消权限
- MOOC清华《程序设计基础》第4章第2题:最高分与最低分(用复合型折半插入排序法做)
- 让手机软键盘出现“搜索”按钮
- windows环境 redis集群