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

本文详细探讨了在Java编程中运用策略模式的实例,通过实现鸭子游戏来展示如何灵活地处理不同行为。从设计原则出发,阐述了模式的定义与优点,以及在代码实现中的应用技巧。通过策略模式,作者展示了如何动态改变对象的行为,同时讨论了其潜在的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习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)方法,于是当我们要为国王调用匕首武器时,就可以调用此方法!

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

策略模式介绍到此!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值