转载请注明出处: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. Selenium基于Python web自动化基础二 -- 免登录、等待及unittest单元测试框架

    一.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...

  2. 在linux下运行mongodb

    一>下载 1.去mongodb官网下拉框中找到 linux =>RHEL 6 => Package Manager: 2.Instructions for installing wi ...

  3. sql server nullif的使用技巧,除数为零的处理技巧

    在sql server中做除法处理的时候,我们经常需要处理除数为零的情况,因为如果遇到这种情况的时候,sqlserver会抛出遇到以零作除数错误的异常,我们总不希望把这个异常显示给用户吧. 做个会报这 ...

  4. Caffe RPN:把RPN网络layer添加到caffe基础结构中

    在测试MIT Scene Parsing Benchmark (SceneParse150)使用FCN网络时候,遇到Caffe错误. 遇到错误:不可识别的网络层crop 网络层 CreatorRegi ...

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

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

  6. vt100控制符

    vt100控制符是比较古老的字符,基本上的终端都能支持 今天突然来了兴致玩一玩儿 颜色配置 下面是我写的各种背景和字体颜色的搭配演示,挑选一种你喜欢的 echo -en "[背景\字体] & ...

  7. 系统异常 NSException.h

    FOUNDATION_EXPORT NSExceptionName const NSGenericException; FOUNDATION_EXPORT NSExceptionName const ...

  8. SDK_组合框的使用

    组合框的使用 组合框的创建:有三种风格,分别 Simaple,Dropdown(可输入), 下拉列表(不可输入) 可以通过可视化编程中下拉列表的 下拉箭头 设置列表的长度 如何向组合框控件中添加数据, ...

  9. iframe使用大全

    <iframe src=”you page’s url” width=”100″ height=”30″ frameborder=”no” border=”0″ marginwidth=”0″ ...

  10. buf.writeInt8()函数详解

    buf.writeInt8(value, offset[, noAssert]) value {Number} 需要被写入到 Buffer 的字节 offset {Number} 0 <= of ...