《Head First设计模式》读书笔记之策略模式

来源:互联网 发布:研华usb数据采集卡 编辑:程序博客网 时间:2024/05/16 10:46

学习java快一年了,一开始学习java是为了编写android软件,最近花了一个月做出了个android小软件,开发完了才觉得java学的有点不是很牢固,所以想找几本关于java的书看看。前几天上微薄一个大神介绍了几本java初级的书,其中就这本《Head First设计模式》,于是就打算把这本书好好看看。感觉这本书很适合初学者,而且讲解的挺有趣的,不会让你感到有种压力。以前也学了一点设计模式,但没怎么搞明白,这本书刚看了第一章就感觉收获挺大的,于是就乘热打铁写写笔记来加深记忆。
目前刚看了两章,先来个策略模式(Strage pattern)

书中举得例子是鸭子游戏的实现,为了实现这个鸭子游戏的弹性,引出了三条设计原则:

1.找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。

例子中将鸭子飞行行为和鸣叫行为(各种鸭子的飞行行为和鸣叫行为有所不同)和鸭子的游泳行为分开独立出来。

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

鸭子的行为和鸭子种类都是实现了Interface,而不是针对真实的类。

3.多用组合(composition),少用继承

书中提出:有一个比是一个更好,鸭子的行为是一个一个组合而来的,每一个行为都实现一个行为接口,这样更易于对鸭子行为的添加与修改

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

下面完成了设计谜题中的习题:

//抽象环境角色,Character超类,所有人物角色都继承自该类public abstract class Character{WeaponBehavior weapon;public void fight();publci void setWeapon(WeaponBehavior w){this.weapon=w;}}
//皇后类,具体环境角色,持有一个策略类的引用,最终给客户端调用的,继承自人物类public class Queen extends Character{public Queen(){weapon=new KnifeBehavior();//持有匕首}public void fight(){weapon.useWeapon();}}
//国王类,具体环境角色,持有一个策略类的引用,最终给客户端调用的,继承自人物类public class King extends Character{public King(){weapon=new SwordBehavior();//持有宝剑}public void fight(){weapon.useWeapon();}}
//抽象策略角色:策略类,通常由一个接口或者抽象类实现,武器接口public interface WeaponBehavior{public void useWeapon();}
//具体策略角色,包装了相关的算法和行为,匕首武器,实现了武器接口public class SwordBehavior implements WeaponBehavior{public void useWeapon(){System.out.println("I use sword!");}}
//具体策略角色,包装了相关的算法和行为,宝剑武器,实现了武器接口public class KnifeBehavior implements WeaponBehavior{public void useWeapon(){System.out.println("I use knife!");}}

为了动态的改变人物的武器行为,我们可以为Character类编写setWeapon(WeaponBehavior weapon)方法,于是当我们要为国王调用匕首武器时,就可以调用此方法!

其实策略模式也有缺点,比如客户必须要知道所有的策略类,并自行决定使用哪一个策越类,另一个问题是会造成许多的具体的策略类

策略模式介绍到此!