夜话JAVA设计模式之策略模式
2024-08-29 17:04:08
策略模式
定义了算法簇,分别封装起来,让他们之间可以互相替换,让算法簇的变化独立于使用算法的客户。
设计原则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();
}
最新文章
- Halcon与opencv格式的转换
- SVN命令使用详解
- Objective-C 和 C++中指针的格式和.方法 和内存分配
- VS2013修改MVC4默认生成的模板
- ios实现类似魔兽小地图功能 在
- JVM内存区域模型
- 第22条:理解NSCopying协议
- django中form表单的提交:
- Getting Started · Building a RESTful Web Service
- [转]Laravel 4之路由
- [翻译]Orchard-修改首页布局
- 微信小程序初体验--封装http请求
- 正则表达式——Java程序员懂你
- 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障
- 在Pycharm中自动添加时间日期作者等信息
- algernon 基于golang 的独立的支持redis lua pg。。。 的web server
- 探索基于.NET下实现一句话木马之ashx篇
- 起步 - vue-router路由与页面间导航
- Android studio 安装已经下载好的gradle.zip文件【ubuntu 14.04 LTS环境】
- 8.29 jQuery
热门文章
- Android 性能优化(9)网络优化( 5)Optimizing Server-Initiated Network Use
- springmvc中的web.xml配置(包含中文乱码解决)
- uiautomatorviewer详解
- 牛客网-3 网易编程题(1拓扑&;2二叉树的公共最近祖先&;3快排找第K大数)
- cloudera-agent启动File not found : /usr/sbin/cmf-agent解决办法(图文详解)
- 几个不同的tab切换示例
- HDU_1242_Rescue
- MySql学习笔记(四) —— 数据的分组
- 【Linux】 JDK安装及配置 (linux-tar.gz版)
- .net core Elasticsearch 查询更新