封装变化----策略模式

考虑到下面这种情行:

一个动作冒险游戏:有不同的角色:弓箭手(Archer),战士(Warrior),有不同的武器:剑(Sword),匕首(Knife),弓(Bow)。。。

实现:每个角色能使用一种武器,并可以在游戏过程中换武器。


常规做法:超类Character,接口WeaponBehavior

例如 战士(Warrior)继承Character,实现WeaponBehavior获得使用剑(Sword)或者匕首(Knife)的行为。

弊端:1:需要重复写相同的代码。例如 新的角色 也使用 剑(Sword)时,又要实现一样的方法。

2:不能在运行时动态改变行为。即不能再游戏过程中换武器。耦合度太高。


策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换。


第二种做法则是使用策略模式:

 1:将变化封装起来。(这个场景变化就是使用不停的武器。

//定义使用武器的接口WeaponBehavior

public interface WeaponBehavior {

void useWeapon();

}

//定义使用不同武器的行为 SwordBehavior和KnifeBehavior

public class SwordBehavior implements WeaponBehavior{

@Override

public void useWeapon() {

System.out.println("use Sword");

}

}

public class KnifeBehavior implements WeaponBehavior{

@Override

public void useWeapon() {

System.out.println("use Knife");

}

}

2 定义角色类

//超类

public abstract class Character {

WeaponBehavior weaponBehavior;

public void setWeapon(WeaponBehavior weaponBehavior){

this.weaponBehavior = weaponBehavior;

}

abstract void fight();

}


//定义具体角色类

public class Knight extends Character{

private WeaponBehavior weaponBehavior;

public  Knight() {

this.weaponBehavior = new SwordBehavior();

}

@Override

void fight() {

weaponBehavior.useWeapon();

}

public void setWeapon(WeaponBehavior weaponBehavior){

this.weaponBehavior = weaponBehavior;

}

}

这样设计的好处:当在设计其他角色时,只需要将要使用的武器组合上去即可,而不用写重复的代码,这也是面向接口编程,而不是针对实现编程。并且可以在运行时换武器,使用implements的方法则会将角色与武器耦合在一起而做不到这一点。

public static void main(String[] args) {

Character knight = new Knight();

knight.fight();

knight.setWeapon(new KnifeBehavior());

knight.fight();

}

输出:use Sword

use Knife

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,242评论 19 139
  • 多态 任何域的访问操作都将有编译器解析,如果某个方法是静态的,它的行为就不具有多态性 java默认对象的销毁顺序与...
    yueyue_projects阅读 998评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,834评论 18 399
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,790评论 0 33
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,717评论 1 114