Java设计模式菜鸟系列(一)策略模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39721563
今天開始咱们来谈谈Java设计模式。
这里会结合uml图形来解说,有对uml建模不熟的能够參考我的还有一篇博文uml建模。
首先。个人认为模式的设计就是一个将变化的东西和不变(稳定)的东西分离的过程。
咱们的应用中可能有非常多须要改变的地方,而模式要做的就是把它们“抽取”出来并进行“封装”和“实现”,因此很多其它的时候咱们是面向接口编程。
以下将结合《Head First 设计模式》这一书中的某些详细案例以及本人的理解进行解说。
假设大家透过看图能说出是哪种模式并能进行详细的代码实现及加以应用。反之也能做到,那么我想关于Java这些常见的设计模式你也就掌握的几乎相同了。
关于策略模式。网上有的说法是:策略模式让用户能够选择运行一个动作的方法,也就是说,用户能够选择不同的策略来进行操作。个人认为策略模式能够用这个公式:不同的XXX 拥有不同的XXX供用户选择。比方说:不同的象棋棋子拥有不同的走法供用户选择。
以下依据游戏中的不同人物拥有不同武器供用户选择的简单案例:
一、UML模型图
二、代码实现
/**
* 武器 --模板
*/
interface WeaponBehavior {
void useWeapon();
} class KnifeBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("实现用匕首刺杀...");
}
} class BowAndArrowBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("实现用弓箭设计...");
}
} class AxeBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("实现用斧头劈砍...");
}
} class SwordBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("实现用宝剑挥舞...");
}
} /**
* 角色
*/
abstract class Character {
// 将接口作为抽象角色的Field以便封装
protected WeaponBehavior weaponBehavior; public void setWeapon(WeaponBehavior w) {
weaponBehavior = w;
} /**
* 这里有点相似“代理模式”
*/
public void performWeapon() {
// do something...
weaponBehavior.useWeapon();
// do something...
} public abstract void fight();
} /**
* 国王使用宝剑挥舞
*/
class King extends Character { public King() {
weaponBehavior = new SwordBehavior();
} @Override
public void fight() {
System.out.println("国王使用宝剑挥舞...");
} } /**
* 皇后使用匕首刺杀
*/
class Queen extends Character { public Queen() {
weaponBehavior = new KnifeBehavior();
} @Override
public void fight() {
System.out.println("皇后使用匕首刺杀...");
} } /**
* Knight和Troll以此类推。这里就不写了
*/ /**
* client測试
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
Character king = new King();
king.performWeapon();
// 这里有点相似于“状态模式”
king.setWeapon(new AxeBehavior());
king.performWeapon(); Character queen = new Queen();
queen.performWeapon();
queen.setWeapon(new BowAndArrowBehavior());
queen.performWeapon();
}
}
三、应用场景(仅代表个人观点)
游戏中的角色武器、棋类游戏中的棋子走法等。
四、小结
以上内容假设有不同的见解或疏忽的地方,还请大家提出宝贵的建议或意见。
最后大家能够试着将以下的uml模型进行详细的代码实现,如图:附源代码
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGh5X3ljdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
Java设计模式菜鸟系列(一)策略模式建模与实现的更多相关文章
- Java设计模式菜鸟系列(九)外观模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39805735 外观模式(Facade):是为了解决类与类之间的依赖关系的,像spring一 ...
- Java设计模式菜鸟系列(七)命令模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39804057 命令模式(Command):将"请求"(命令/口令)封装 ...
- Java设计模式菜鸟系列(十七)桥接模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40008711 桥接模式(Bridge): 把事物和其详细实现分开(抽象化与实现化解耦),使 ...
- Java设计模式菜鸟系列(十)模板方法模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39806973 模板方法模式(Template Method):在一个方法中定义了一个算法的 ...
- Java设计模式(18)策略模式(Strategy模式)
Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...
- JAVA设计模式——第 1 章 策略模式【Strategy Pattern】(转)
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的. 先说这个场景 ...
- JAVA设计模式——(2)策略模式
定义 定义一种算法,将每个算法都封装起来,并且使它们之间可以互换.是一种行为类模式. 举例 为了通俗易懂,我们拿各国的税率计算来举例子: 假设当前我们的程序只能支持计算中国和美国的税率: public ...
- Java设计模式(一) 策略模式
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 1,定义算法接口 package com.pattern.strategy.test; publ ...
- Java设计模式(七)策略模式 模板模式
(十三)策略模式 策略图案限定了多个封装算法,该算法可以相互替换包.法的客户.借用还有一位大神的样例. interface ICalculator{ public int calculate(Stri ...
随机推荐
- 【PostgreSQL-9.6.3】LOG: unrecognized configuration parameter "dynamic_shared_memory_type"
报错如下: 输入如下命令启动PG数据库时,报错: [postgres@drz ~]$ pg_ctl -D /opt/postgresql/data/ start server starting FAT ...
- Farseer.net轻量级开源框架 入门篇:查询数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 下一篇:Farseer.net轻量级开源框架 中级篇: Where条 ...
- ajax的底层前后台交互
为什么用ajax或者它的优点: 异步加载数据,无需切换页面 更加的用户体验,局部刷新,及时验证,操作步骤简化: 节省流量 js控制数据的加载,更加灵活多用. 底层就是XMLHttpRequest对象: ...
- (转)淘淘商城系列——商品搜索功能Dao实现
http://blog.csdn.net/yerenyuan_pku/article/details/72909286 终于进入商品搜索功能的开发中了,本文我来教大家编写实现商品搜索功能的Dao层代码 ...
- 设置vscode为中文
设置vscode为中文 ctr+shift+p 输入 configure language 进 en更改为zh-cn , 重启vscode即可 , 如果还不行,就安装插件
- 梦想MxWeb3D,三维CAD协同设计平台 2019.05.05更新
SDK开发包下载地址: http://www.mxdraw.com/ndetail_20140.html 在线演示网址: http://www.mxdraw.com:3000/ 1. 增加CAD绘图 ...
- 第一节:EasyUI样式,行内编辑,基础知识
一丶常用属性 $('#j_dg_left').datagrid({ url: '/Stu_Areas/Stu/GradeList', fit: true, // 自动适应父容器大小 singleSel ...
- HDU6189 Law of Commutation (数论)
题意:输入n和a 定义m等于2的n次方 求1-m有多少数使得 a^b = b^a (mod m) 题解:先打表找规律 发现a为奇数的答案只有b = a这一种 (不知道为什么也不想知道为什么 当a为偶数 ...
- Luogu P2052 [NOI2011]道路修建
吐槽一下 我开了\(-O2\)优化结果跑的更慢了什么鬼???!!! 我怕不是吸了一口毒氧气 不要脸的放上我的博客,欢迎大家前来面基 题目大意 给定一棵有\(n\)个节点的树,树中有\({n-1}\)条 ...
- MFC 课程总结
<基于MFC框架开发>马志国 1491989781 MFC课程的组成 1.1 MFC应用程序的组成部分.执行机制和执行流程(10.5天). 1.2 Windows平台上的数据库访问技术(1 ...