`

《深入浅出设计模式》读书笔记--策略模式与三个设计原则

阅读更多

从今天开始,学习《深入浅出设计模式》这本书,并每看完一章就自己写些代码来加深理解,并把文中的一些知识写出来,和代码一起更新到博客里。(中文和英文版pdf,另找地址上传,建议英文版,比较清晰)

对于设计模式,先摘抄此书中文版的一句话: 信耶稣的人都要读圣经,而信 OO 的人都要读四人组的《设计模式》

另一句:使用模式的最好方式是:把模式装进脑子,然后在你的设计和已有的应用中,寻找何处可以使用它们。


在第一章,先是以一个模拟鸭子程序开始,一个Duck的父类,有很多个继承Duck类的具体鸭类。目前遇到这样的情况:  

1.       继承,不易知道所有鸭子的公共方法,在父类修改为牵连到所有子类,

 

第一版鸭子程序

 

2.       老板要求增加一个飞方法(fly())时,在父类增加,导致所有鸭子都可飞,有些是塑料鸭子也可以飞了,不妥;

3.      那不在父类增加fly()方法,而是把飞的方法抽象为一接口,让会飞的实体鸭类才实现该接口,但这又导致了重复代码的危险,因为每个实现飞接口的子类都要有相同的飞实现代码,万一以后又要对飞方法的修改,那就要对所有实现了飞接口的子类都修改,仍不妥;

 

4.       最后想出一个办法:增加 FlyBehavior 接口,其中接口中有一个方法,分别是 fly() ,并写相应实现接口的类。

 

 

其中Duck类里的performFly()方法代码(另增加一个设置该类飞行行为的方法setFlyBehavior() ):

	public void performFly() {
		flyBehavior.fly();
	}
	public void setFlyBehavior (FlyBehavior fb) {
		flyBehavior = fb;
	}

到这里,设计已经几乎完成了,如果要更改fly方法,只需增加一个实现FlyBehavior接口的方法,并调用setFlyBehavior,就可以在运行时动态地更改fly方法。

 

 

下面是 提到的设计原则,从上面的代码也可以体现出来:

一. 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。(把会变化的部分取出并“封装”起来,使得系统某部分的改变不会影响其它)。

二. 针对接口编程,而不是针对实现编程。

三. 多用组合,少用继承。

 

策略模式的定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

 

接下来是为Design Puzzle里的设计的代码,背景是:

这是一个为动作冒险游戏而设计的程序,其中会用到角色类(Character),角色可以用不同的武器,但一次只能用一种武器,而且在游戏过程中可以更换武器。

背景英文原文 写道
Below you’ll fi nd a mess of classes and interfaces for an action adventure game. You’ll
fi nd classes for game characters along with classes for weapon behaviors the characters
can use in the game. Each character can make use of one weapon at a time, but can
change weapons at any time during the game. Your job is to sort it all out...
 

下面直接贴出答案,自己可以先思考一下。

UML类图为:

character_uml

 

 

鉴于篇幅,只贴部分代码,全部代码见附件:

package chow.hfdp.chapter1.designPuzzle;

//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : Character.java
//  @ Date : 2011/9/3
//  @ Author : bosshida
//
//

public abstract class Character {
	public WeaponBehavior weapon;
	public void setWeapon(WeaponBehavior weapon){
		this.weapon = weapon;
	}
	
	public abstract void fight();
}
 
package chow.hfdp.chapter1.designPuzzle;

//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : King.java
//  @ Date : 2011/9/3
//  @ Author : bosshida
//
//

public class King extends Character {
	public void fight() {
		System.out.print("我是国王 ");
		weapon.useWeapon();
	}
}

 

package chow.hfdp.chapter1.designPuzzle;

//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : WeaponBehavior.java
//  @ Date : 2011/9/3
//  @ Author : bosshida
//
//

public interface WeaponBehavior {
	public void useWeapon();
}
 
package chow.hfdp.chapter1.designPuzzle;

//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : SwordBehavior.java
//  @ Date : 2011/9/3
//  @ Author : bosshida
//
//

public class SwordBehavior implements WeaponBehavior {
	public void useWeapon() {
		System.out.println("出剑");
	}
}

 

package chow.hfdp.chapter1.designPuzzle;

/**
 * 这是一个为动作冒险游戏而设计的程序,其中会用到角色类(Character),角色可以用不同的武器<br>
 * 但一次只能用一种武器,而且在游戏过程中可以更换武器。这时用到策略模式,并遵守三种设计原则:<br>
 * 1.独立变化并封装(武器更换作为一种Behavior);2.针对接口编程,不是针对实现编程(WeaponBehavior)<br>
 * 为一接口);3.多用组合,少用继承(在Character类里,组合一个weapon对象) <br>
 * 策略模式定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化<br>
 * 独立于使用算法的客户(这里是对使用武器不同而封装)
 * @author bosshida
 * @date 2011-9-3
 */
public class Main {
	public static void main(String[] args) {
		Character king = new King();
		Character troll = new Troll();
		
		king.setWeapon(new BowAndArrowBehavior());
		troll.setWeapon(new AxeBehavior());
		
		king.fight();
		troll.fight();
		
		king.setWeapon(new SwordBehavior());
		king.fight();
	}
}

 

运行结果:

我是国王 拉弓,放箭
我是怪物 挥斧头
我是国王 出剑

 

 

分享到:
评论

相关推荐

    深入浅出mfc-笔记

    ### 深入浅出MFC—笔记关键知识点解析 #### 一、Windows消息机制与回调函数 在深入了解MFC之前,我们首先需要理解Windows操作系统的基本工作原理,尤其是消息驱动模型以及回调函数的概念。 **1.1 Windows消息机制...

    图解设计模式 ,结城浩著 学习笔记

    《图解设计模式》是一本由日本著名程序员结城浩撰写的书籍,该书以图形化的方式深入浅出地讲解了软件设计中的各种模式。下面将对设计模式的基本概念、分类以及书中可能提及的部分具体模式进行详细的介绍和分析。 ##...

    《Hear First设计模式》阅读笔记

    这本书通过深入浅出的方式,引导读者理解和掌握设计模式这一软件开发中的重要概念。设计模式是解决常见问题的经验总结,是软件工程中的一种最佳实践。在阅读《Hear First设计模式》的过程中,我们可以了解到各个章节...

    HeadFirst设计模式笔记

    总的来说,《HeadFirst设计模式笔记》通过`PizzaIngredientFactory`的例子,深入浅出地介绍了设计模式的重要性及其在实际编程中的应用。学习和掌握设计模式,能帮助开发者编写出更加优雅、灵活的代码,提高团队协作...

    Head First 设计模式 扫描版

    这本书以其独特的视觉风格和易于理解的教学方法,深入浅出地介绍了设计模式这一复杂的主题。设计模式是软件工程中经过实践验证的解决方案,用于解决在面向对象设计中常见的问题。 本书包含23种经典的设计模式,这些...

    Python学习笔记-王纯业

    这个教程深入浅出地介绍了Python编程的基础知识,帮助初学者快速上手。下面将详细阐述该教程中可能包含的重要知识点,以及Python入门者需要了解的基本概念。 1. **Python基础语法**:Python的语法简洁明了,易于...

    Java设计模式第2版中文版.rar

    总之,《Java设计模式第2版中文版》是一本涵盖全面、深入浅出的教程,无论是初学者还是经验丰富的开发者,都能从中受益。通过学习这本书,你可以提升自己的编程思维,写出更优雅、更健壮的代码,为团队协作和项目...

    SSH-框架笔记

    学习SSH框架笔记,不仅可以掌握这三个框架的基本用法,还能深入理解Java Web开发中的设计原则和最佳实践。这份笔记内容广泛,包括各个框架的主要概念、配置、API使用、实战案例等,对于提升Java开发技能大有裨益。

    经典案例深入浅出学Python视频课程下载整理.zip

    该压缩包文件“经典案例深入浅出学Python视频课程下载整理.zip”主要包含了一系列与学习Python编程相关的资源,尤其适合初学者和希望深入理解Python应用的开发者。通过这个课程,你可以掌握Python的基础语法、核心...

    周三多 管理学 第二版笔记,分章整理.

    接着,笔记深入浅出地讲解了决策理论,强调了决策在管理中的核心地位。包括理性决策模型、有限理性模型和满意决策原则等,让读者理解如何在实际中做出有效决策。 此外,组织行为部分探讨了个体、群体和组织的行为...

    Java JDK 6.0 学习笔记.pdf

    同时,还需要理解封装、继承和多态这三大面向对象特性,它们是Java设计模式的基础。 **物件向导** 深入理解类的构造器、访问修饰符、静态成员与实例成员的区别。熟悉如何使用this关键字和super关键字,以及如何进行...

    韩顺平java笔记完整版

    【描述】:这份笔记是韩顺平老师教学经验的结晶,旨在帮助学习者系统地理解和掌握Java语言,通过深入浅出的方式讲解了Java的核心概念、语法特性以及实际开发中的应用。 【标签】: 1. **韩顺平**:中国知名IT教育家...

    java并发编程实践笔记资料.pdf

    20. 设计线程安全的类,应该包括哪些是可变共享变量,哪些是不可变的变量,以及指定一个管理并发访问对象状态的策略。 21. 将数据封装在对象内部,并保证对数据的访问是原子的,例如volatile JavaBean模型或构造...

    标配笔记本术语介绍(全面经典)

    本文将深入浅出地解析“标配笔记本术语介绍”,帮助读者全面理解笔记本电脑的专业知识。 一、硬件部分 1. **处理器**:处理器是笔记本的心脏,如Intel的Core i5、i7或AMD的Ryzen 5、7等。它们决定了电脑的计算能力...

    MLDNJava软件培训课堂笔记

    《Java MLDN软件培训课堂笔记》是一份深入浅出的Java学习资源,特别适合初学者作为入门教材。这份笔记由MLDN(可能是Machine Learning and Data Networking的缩写)培训机构的专业讲师精心编制,旨在帮助学员系统地...

    数据库系统概论王珊第五版学习笔记.doc

    数据库系统概论是理解数据库理论和技术的关键,王珊教授的著作深入浅出地介绍了这一领域的核心概念。本笔记主要涵盖以下几个方面: 1. 数据库基本概念: - 数据:是数据库中存储的基本单元,用于描述现实世界中的...

    精通structs笔记

    这篇笔记将深入浅出地介绍Struts的核心概念和使用方法,非常适合初学者作为入门的学习资料。 一、Struts框架概述 Struts框架是基于Servlet和JSP的,它的核心是ActionServlet,这是一个定制的Servlet,负责处理所有...

    灰狐驱动学习笔记系列文章

    ### 灰狐驱动学习笔记系列文章:深入浅出的驱动知识分享 #### 知识点一:驱动学习笔记的背景与目标 灰狐的驱动学习笔记系列文章是一套宝贵的资源,旨在帮助初学者和有兴趣深入研究驱动开发的读者更好地理解和掌握...

    Windows程序设计笔记(1,2,3)

    这本书深入浅出地讲解了如何利用Windows API函数来构建应用程序,尤其对于理解Windows操作系统的基础工作原理具有极大的帮助。 首先,Windows操作系统是一个支持抢占式多任务和多线程的图形系统。这意味着多个程序...

Global site tag (gtag.js) - Google Analytics