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 ...
随机推荐
- 全3D模具设计自动化解決方案
- 基于 CentOS 搭建Seafile个人网盘
一.安装 Seafile 安装依赖环境使用 yum 安装 Python 及 MySQL: yum install python python-setuptools python-imaging pyt ...
- vue基础---列表渲染
首先简单回顾下v-for‘指令 <ol id="list_area"> <li v-for="book in books">{{book ...
- oracle 备份/恢复
oracle备份是为了有问题能够快速恢复:
- LeetCode_16 3SumCloest
3Sum Closest Given an array nums of n integers and an integer target, find three integers in nums su ...
- 散列--P1047 校门外的树
题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,-,L,都种有 ...
- 洛谷——P1549 棋盘问题(2)
P1549 棋盘问题(2) 搜索||打表 #include<cstdio> #include<cstring> #include<iostream> #includ ...
- [luogu4127 AHOI2009] 同类分布 (数位dp)
传送门 Solution 裸数位dp,空间存不下只能枚举数字具体是什么 注意memset最好为-1,不要是0,有很多状态答案为0 Code //By Menteur_Hxy #include < ...
- PHP+Python,轻量维护超轻松
window下安装Python 直接去Python官网下载msi安装程序安装即可(选择自定义安装才能修改程序安装路径哦) widows下Python的数据库访问模块PyMysql的安装 1.open ...
- Django DTL模板语法中的循环的笔记
for...in...笔记: for...in...标签: for...in...类似于Python中的for...in....可以遍历列表.元组.字符串.字典等一切可以遍历的对象.示例代码如下: { ...