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以此类推,这里就不写了
 */

/**
 * 客户端测试
 *
 * @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模型进行具体的代码实现,如下图:附源码

时间: 2024-12-05 13:20:09

Java设计模式菜鸟系列(一)策略模式建模与实现的相关文章

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

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39805735 外观模式(Facade):是为了解决类与类之间的依赖关系的,像spring一样,可以将类与类之间的关系配置到配置文件中,而外观模式就是将他们的 关系放在一个Facade类中,降低了类与类之间的耦合度,该模式中没有涉及到接口. 一.uml建模: 二.代码实现: /** * 示例:外观模式,也称门面模式 * * 优点:为了解决类与类之间的依赖关系,降低了类与类之间的耦合度 *

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

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39806973 模板方法模式(Template Method):在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以再不改变算法结构的情况下,重新定义算法中的某些步骤.简而言之:模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现. 一.uml建模: 二.代码实现: /** * 示例:模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现.

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

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40008711 桥接模式(Bridge): 把事物和其具体实现分开(抽象化与实现化解耦),使他们可以各自独立的变化.假设你的电脑是双系统(WinXP.Win7),而且都安装了mysql.oracle.sqlserver.DB2这4种数据库,那么你有2*4种选择去连接数据库.按平常的写法,咱要写2*4个类,但是使用了桥接模式,你只需写2+4个类,可以看出桥接模式其实就是一种将N*M转化成N+

Java设计模式菜鸟系列(十三)状态模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39829859 状态模式(State):允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.状态模式说白了就是一个对像有不同的状态,不同的状态对应不同的行为,它其实是对switch case这样的语句的拓展. 一.uml建模: 二.代码实现 /** * 示例:状态模式-- 一个对像有不同的状 态,不同的状态对应不同的行为 * * 下面四则运算为例 */ interface S

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

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39804057 命令模式(Command):将"请求"(命令/口令)封装成一个对象,以便使用不同的请求.队列或者日志来参数化其对象.命令模式也支持撤销操作.命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开. 一.uml建模 二.代码实现: /** * 示例:以咱去餐馆吃饭为例,分为3步 * * 1.和小二说,来个宫保鸡丁 --> 顾客发出口令 * *

Java设计模式菜鸟系列(十一)迭代器模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39807741 迭代器模式(Iterator):提供了一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 一.uml建模: 二.代码实现 /** * 示例:迭代器模式 * */ interface Iterator { /** 前移 */ public Object previous(); /** 后移 */ public Object next(); /** 判断是否有下

Java设计模式菜鸟系列总结及博客全目录

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40031567 今天来对这23种设计模式做个总结.咱使用设计模式的目的是为了可重用代码.让代码更容易被他人理解.保证代码可靠性,当然设计模式并不是万能的,项目中的实际问题还有具体分析.咱不能为了使用设计模式而使用,而是在分析问题的过程中,想到使用某种设计模式能达到咱需要的效果,而且比不使用设计模式更有优势,那么咱该考虑使用设计模式了. 一.设计模式的一般分类 创建型(Creator)模式(

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

(十三)策略模式 策略模式定义了多个封装起来的算法,封装的算法可以相互替换,并且算法的变化不会影响到使用算法的客户.借用另一位大神的例子. interface ICalculator{ public int calculate(String exp); } abstract class AbstractCalculator{ public int[] split(String exp,String opt){ String array[] = exp.split(opt); int arrayI

java设计模式(六)策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们可以相互替换,让算法独立于使用它的客户而独立变化,具体应用场景如第三方支付对接不同银行的算法. 要点:1)抽象策略角色    2)具体策略角色:包装相关算法和行为 3)环境角色:持有一个策略类的引用,最终给客户端调用 1.抽象策略接口 public interface SwimmingStratege { public void swimming(); } 2.具体策略角色SwimmingWithFoot public class S