`

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模型进行具体的代码实现,如图:附源码

 

分享到:
评论

相关推荐

    vue+springboot基于Java Web的校园菜鸟驿站管理系统_99y82毕业设计源码.zip

    本系统基于B/S结构模式,采用idea开发环境,建模工具Visio,以及关系型数据库MySQL。 系统采用前后端分离框架vue进行开发。前端开发负责页面的编写及数据的渲染。后端开发负责提供API(接口)。采用了MVC(Model-...

    毕业设计,基于用户行为的社交网络推荐算法研究与实现.zip

    《基于用户行为的社交网络推荐算法研究与实现》是一个典型的计算机科学毕业设计项目,主要探讨了如何运用算法来提升社交网络中的用户体验,特别是在信息推荐方面。这个项目涉及到多个关键知识点,包括社交网络分析、...

    本科毕业设计.zip

    这涉及到面向对象设计原则(如单一职责、开闭原则等)和设计模式(如工厂模式、观察者模式等)的应用。 3. **编程实现**:根据设计文档编写代码,这可能涉及到Java、Python、C++等编程语言,以及数据库管理(SQL)...

    许孟2014本科毕业设计.zip

    2. **系统设计**:在需求明确后,许孟会进行系统架构设计,包括模块划分、接口定义等,这部分可能涉及到软件工程中的设计模式,比如工厂模式、单例模式等,以及UML(统一建模语言)工具的使用,如用例图、类图、序列...

    jx的比赛库.zip

    7. **代码组织与设计模式**:高质量的源码会遵循一定的设计原则,如单一职责原则、开闭原则等。常见的设计模式如工厂模式、单例模式、观察者模式等可能会在代码中出现,以提高代码的可读性和可维护性。 8. **文档与...

    本科毕业设计使用程序终版.zip

    3. **编程实现**:选择合适的编程语言(如Java、C++、Python等)和开发框架(如Spring Boot、Django、Flask等),将设计转化为代码。在此阶段,学习和应用面向对象编程、异常处理、数据结构与算法等知识至关重要。 ...

    毕设&课程作业_智能校园课调系统.zip

    【压缩包子文件的文件名称列表】"Graduation Design"可能包含了一系列与毕业设计相关的文件,如需求文档、设计文档、源代码文件夹、数据库脚本、测试报告、用户手册等。这些文件共同构成了项目开发的全貌,对于学习...

    基于JSP+MVC+MySQL+Apache Tomcat的学生管理系统.zip

    2. **Model-View-Controller(MVC)模式**:这是一种软件设计模式,用于分离应用程序的数据模型、用户界面和控制逻辑。在学生管理系统中,Model层负责数据处理和业务规则,View层呈现用户界面,Controller层接收用户...

    Kesci比赛练习.zip

    - **设计模式**:单例模式、工厂模式、装饰器模式等,用于提高代码的可读性和可维护性。 - **网络编程**:如果项目涉及网络交互,可能会用到HTTP请求、WebSocket通信等。 - **数据库操作**:如SQL查询、事务处理、...

    仙林软件奇侠传——EL比赛.zip

    在软件开发中,设计模式是一种通用解决方案,比如单例模式、工厂模式、观察者模式等。参赛者可能会在项目中应用这些模式,提高代码可读性和可维护性。 ### 5. 软件工程原则 项目可能遵循软件工程的最佳实践,如模块...

    基于springboot+微信小程序的疫苗预约接种系统.zip

    微信小程序是一种轻量级的应用开发模式,可在微信内运行,无需安装即可使用。项目中,微信小程序作为用户端,提供了预约、查询、提醒等功能。利用微信小程序API,可以实现与后端服务的无缝交互,如用户登录授权、...

    基于威胁情报基础库的关联关系可视化,本科毕业设计和答辩PPT,优秀毕设.zip

    本毕业设计的重点是建立一个系统,能够通过关联关系可视化来提升对威胁情报的理解和利用。 关联关系可视化是指将不同威胁元素之间的联系以图形化方式展示,例如通过网络图或树状结构。这种方法有助于发现潜在的攻击...

    J2EE软件工程师全部培训课程总结

    - **模式**:解决常见问题的设计模式。 #### CVS - **CVS介绍**:CVS是一个版本控制系统。 - **匿名语句块**:在PL/SQL中定义的一段代码。 - **record对象**:用于存储一组相关字段的数据结构。 - **分支结构**:...

    sqldeveloper免安装版

    9. **数据模型er**:内置的数据建模工具可以帮助你设计复杂的实体关系模型,便于理解和改进数据库结构。 10. **作业调度**:你可以安排定期运行的任务,如备份、清理、数据加载等,实现自动化维护。 SQL Developer...

    毕设&课程作业_智能 BI 系统.zip

    7. **毕业设计实施**:对于学生而言,实施一个智能BI系统可能包括需求分析、系统架构设计、数据库建模、程序编写、测试和优化等多个阶段,是一次全面的项目实践经验。 8. **课程作业**:可能涉及的任务包括编写ETL...

Global site tag (gtag.js) - Google Analytics