学习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)方法,于是当我们要为国王调用匕首武器时,就可以调用此方法!
其实策略模式也有缺点,比如客户必须要知道所有的策略类,并自行决定使用哪一个策越类,另一个问题是会造成许多的具体的策略类
策略模式介绍到此!