转载请注明出处: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设计模式菜鸟系列(一)策略模式建模与实现的更多相关文章

  1. Java设计模式菜鸟系列(九)外观模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39805735 外观模式(Facade):是为了解决类与类之间的依赖关系的,像spring一 ...

  2. Java设计模式菜鸟系列(七)命令模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39804057 命令模式(Command):将"请求"(命令/口令)封装 ...

  3. Java设计模式菜鸟系列(十七)桥接模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40008711 桥接模式(Bridge): 把事物和其详细实现分开(抽象化与实现化解耦),使 ...

  4. Java设计模式菜鸟系列(十)模板方法模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39806973 模板方法模式(Template Method):在一个方法中定义了一个算法的 ...

  5. Java设计模式(18)策略模式(Strategy模式)

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...

  6. JAVA设计模式——第 1 章 策略模式【Strategy Pattern】(转)

    刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的. 先说这个场景 ...

  7. JAVA设计模式——(2)策略模式

    定义 定义一种算法,将每个算法都封装起来,并且使它们之间可以互换.是一种行为类模式. 举例 为了通俗易懂,我们拿各国的税率计算来举例子: 假设当前我们的程序只能支持计算中国和美国的税率: public ...

  8. Java设计模式(一) 策略模式

    策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 1,定义算法接口 package com.pattern.strategy.test; publ ...

  9. Java设计模式(七)策略模式 模板模式

    (十三)策略模式 策略图案限定了多个封装算法,该算法可以相互替换包.法的客户.借用还有一位大神的样例. interface ICalculator{ public int calculate(Stri ...

随机推荐

  1. https与http的访问,应对苹果ATS验证问题

    为应对2017年1月1日苹果ATS的问题,微信.微博等等APP要求挂载的网页必须https访问,需要添加ssl认证. 一.SSL认证 选取了阿里云提供的免费SSL,使用期限为一年.电话咨询阿里客服,免 ...

  2. Modbus测试工具ModbusPoll与Modbus Slave使用方法

    感谢https://blog.csdn.net/byxdaz/article/details/77979114原创,由于CSDN经常调整,故再编辑收藏,并修改了部分BUG. 一.介绍 Modbus P ...

  3. 梦想CAD控件 2018.10.15更新

    下载地址: http://www.mxdraw.com/ndetail_10105.html 1. 完善com接口的ToCurves函数,转换CAD文字,多行文字到曲线 2. 修改DrawImage接 ...

  4. 13Microsoft SQL Server SQL 高级事务,锁,游标,分区

    Microsoft SQL Server SQL高级事务,锁,游标,分区 通过采用事务和锁机制,解决了数据库系统的并发性问题. 9.1数据库事务 (1)BEGIN TRANSACTION语句定义事务的 ...

  5. java protostuff 序列化反序列化工具

    protostuff是由谷歌开发的一个非常优秀的序列化反序列化工具 maven导入包: <dependency> <groupId>io.protostuff</grou ...

  6. 【转载】文件上传命令rz和下载命令sz的安装

    一.xshell工具简介 Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议.其可以在Windows界面下用来访 ...

  7. 部署web服务器的配置——补充mysql和tomcat

    今天想到了关于mysql的一些配置,以后关于配置mysql和tomcat相关的内容也会补充在这里. tomcat: 1. 更改内存(要设置tomcat内存,解决内存溢出的问题):安装版tomcat,打 ...

  8. UVA - 808 Bee Breeding (建立坐标系&找规律)

    题目: 输入两个格子的编号a和b(a,b≤10000),求最短距离.例如,19和30的距离为5(一条最短路是19-7-6-5-15-30). 思路: 如图建立坐标系,然后看两个点的向量如果位于二四象限 ...

  9. Address already in use: JVM_Bind:8080错误的解决办法

    解决办法:先到命令行查找8080端口号被那个占用,输入后面的命令:netstat -ano 查到 然后到任务管理器把PID为20904的进程给结束掉,就OK了 -------------------- ...

  10. oracle打开或者关闭flashback

    1.打开flashback: 关闭数据库 SQL>shutdown immediate; 启动到mount方式 SQL>startup mount; 如果归档没有打开,打开归档[因为fla ...