策略模式
    定义了算法簇,分别封装起来,让他们之间可以互相替换,让算法簇的变化独立于使用算法的客户。
设计原则1
    找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
设计原则2
    针对接口编程,而不是针对实现编程。
设计原则3
    多用组合,少用继承。

下面简单的代码描述了不同的角色用武器加入战斗,同时它们也可以切换武器。

话不多说,直接撸代码


1.角色抽象类BaseCharacter

/**
* 角色抽象类
* @author monkjavaer
* @date 2018/08/18 10:35
*/
public abstract class BaseCharacter { WeaponBehavior weaponBehavior; public BaseCharacter(){ } /**
* 切换武器
* @param weaponBehavior
*/
public void setWeaponBehavior(WeaponBehavior weaponBehavior) {
System.out.println("set weapon");
this.weaponBehavior = weaponBehavior;
} /**
* 用不同武器战斗
*/
public abstract void fight(); /**
* 所有继承这个抽象类的都可以说hello
*/
public void sayHello(){
System.out.print("hello!");
}
}

  

1.1国王继承角色

/**
* @author monkjavaer
* @date 2018/08/18 11:30
*/
public class King extends BaseCharacter{ public King() {
weaponBehavior = new KnifeBehavior();
} @Override
public void fight(){
System.out.print("king fight:");
weaponBehavior.useWeapon();
}
}

  

1.2皇后类继承角色

/**
* @author monkjavaer
* @date 2018/08/18 11:32
*/
public class Queen extends BaseCharacter { public Queen() {
weaponBehavior = new KnifeBehavior();
} @Override
public void fight() {
System.out.print("Queen fight:");
weaponBehavior.useWeapon();
}
}

  

2.武器接口WeaponBehavior

/**
* 武器接口
* @author monkjavaer
* @date 2018/08/18 10:38
*/
public interface WeaponBehavior {
/**
* 使用武器
*/
void useWeapon();
}

  

2.1匕首类实现武器接口

/**
* 匕首
* @author monkjavaer
* @date 2018/08/18 11:36
*/
public class KnifeBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("use Knife");
}
}

  

2.2宝剑实现武器接口

/**
* 宝剑
* @author monkjavaer
* @date 2018/08/18 11:35
*/
public class SwordBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("use Sword");
}
}

  

测试类

public static void main(String[] args) {

    BaseCharacter king = new King();
king.sayHello();
king.fight();
king.setWeaponBehavior(new SwordBehavior());
king.fight(); BaseCharacter queen = new Queen();
queen.fight();
}

  

最新文章

  1. Halcon与opencv格式的转换
  2. SVN命令使用详解
  3. Objective-C 和 C++中指针的格式和.方法 和内存分配
  4. VS2013修改MVC4默认生成的模板
  5. ios实现类似魔兽小地图功能 在
  6. JVM内存区域模型
  7. 第22条:理解NSCopying协议
  8. django中form表单的提交:
  9. Getting Started · Building a RESTful Web Service
  10. [转]Laravel 4之路由
  11. [翻译]Orchard-修改首页布局
  12. 微信小程序初体验--封装http请求
  13. 正则表达式——Java程序员懂你
  14. 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障
  15. 在Pycharm中自动添加时间日期作者等信息
  16. algernon 基于golang 的独立的支持redis lua pg。。。 的web server
  17. 探索基于.NET下实现一句话木马之ashx篇
  18. 起步 - vue-router路由与页面间导航
  19. Android studio 安装已经下载好的gradle.zip文件【ubuntu 14.04 LTS环境】
  20. 8.29 jQuery

热门文章

  1. Android 性能优化(9)网络优化( 5)Optimizing Server-Initiated Network Use
  2. springmvc中的web.xml配置(包含中文乱码解决)
  3. uiautomatorviewer详解
  4. 牛客网-3 网易编程题(1拓扑&2二叉树的公共最近祖先&3快排找第K大数)
  5. cloudera-agent启动File not found : /usr/sbin/cmf-agent解决办法(图文详解)
  6. 几个不同的tab切换示例
  7. HDU_1242_Rescue
  8. MySql学习笔记(四) —— 数据的分组
  9. 【Linux】 JDK安装及配置 (linux-tar.gz版)
  10. .net core Elasticsearch 查询更新