Java设计模式之策略模式
2013-01-20 16:25
302 查看
策略模式:
策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 策略模式它主要是定义了一个算法家族,该算法家族内的具体策略类可以自由在交换。它并不是利用继承来实现算法的,而是将多个不同种类的行为组合在接口或抽象类中,在子类中让客户来选择哪一个算法的实现。它主要就是采用委托模型,利用对象组合来在运行的过程中将具体的行为委托至具体的策略类中。
该算法族其实就是许多个类实现了相同的接口,称为策略类,并且各自有不同的实现,策略模式完全屏蔽了超类与子类对于具体行为(或算法)的实现,在子类中,只需要调用设置所要不同的行为的策略类,通过继承超类,超类来利用多态动态的改变所要具体调用的行为或算法。
策略模式一般使用的情况,当一个类有多个子类来需要继承它,而类中某一个行为或者方法在日后的运行中可能会经常发生变化,为了不增加整体的软件的维护复杂度,一般将该行为或者方法单独用一个接口定义,子类根据不同的需要而定义自己的实现这个类的策略类,在超类中只需要定义一个行为的接口,利用多态和组合来处理具体的行为与策略。
样例:
一个游戏中有多个角色,而每个角色都有使用武器的行为,但是每次只能使用一把武器,角色可以进行更换武器。
分析:
抽出经常要变化的,就是武器的具体名,而共同的行为都为使用武器,则可以定义一个接口武器,其余每个都实现该武器,定义自己的所需的武器。对于角色名,定义一个总的抽象类,里面有使用武器的方法,再定义一个武器接口的属性,更换武器的方法,每个角色实现该抽象类角色,或者在构造器初始化角色初始的武器,或者在继承的更换武器方法中定义。
实现:类图如下:
Character类
WeaponBehavior:策略类的父类,所有要更换武器都实现这个
SwordBehavior :一个策略类,只针对一个武器做的具体策略或算法
King:某一个角色具体子类,在构造器中根据需要来进行更换武器的策略类
策略模式的优点:动态改变算法或行为,而不影响整体软件系统,体现了多态与组合的特性
策略模式的缺点:客户必须知道所有的策略类,并自行决定使用哪一个策略类,必须对每一个算法了解,不过可以让客户自行定制一些新的策略类
在编程中要掌握一些基本的设计原则:
设计原则:
1)找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
2)针对接口编程,而不是针对具体编程,真正的意思则就是“针对超类型编程”
3)多用组合,少用继承
本文出自 “在云端的追梦” 博客,请务必保留此出处http://computerdragon.blog.51cto.com/6235984/1122822
策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 策略模式它主要是定义了一个算法家族,该算法家族内的具体策略类可以自由在交换。它并不是利用继承来实现算法的,而是将多个不同种类的行为组合在接口或抽象类中,在子类中让客户来选择哪一个算法的实现。它主要就是采用委托模型,利用对象组合来在运行的过程中将具体的行为委托至具体的策略类中。
该算法族其实就是许多个类实现了相同的接口,称为策略类,并且各自有不同的实现,策略模式完全屏蔽了超类与子类对于具体行为(或算法)的实现,在子类中,只需要调用设置所要不同的行为的策略类,通过继承超类,超类来利用多态动态的改变所要具体调用的行为或算法。
策略模式一般使用的情况,当一个类有多个子类来需要继承它,而类中某一个行为或者方法在日后的运行中可能会经常发生变化,为了不增加整体的软件的维护复杂度,一般将该行为或者方法单独用一个接口定义,子类根据不同的需要而定义自己的实现这个类的策略类,在超类中只需要定义一个行为的接口,利用多态和组合来处理具体的行为与策略。
样例:
一个游戏中有多个角色,而每个角色都有使用武器的行为,但是每次只能使用一把武器,角色可以进行更换武器。
分析:
抽出经常要变化的,就是武器的具体名,而共同的行为都为使用武器,则可以定义一个接口武器,其余每个都实现该武器,定义自己的所需的武器。对于角色名,定义一个总的抽象类,里面有使用武器的方法,再定义一个武器接口的属性,更换武器的方法,每个角色实现该抽象类角色,或者在构造器初始化角色初始的武器,或者在继承的更换武器方法中定义。
实现:类图如下:
Character类
public class Character { WeaponBehavior weapon; public void fight() { weapon.useWeapon(); } public void setWeapon(WeaponBehavior weap) { this.weapon=weap; } }
WeaponBehavior:策略类的父类,所有要更换武器都实现这个
public interface WeaponBehavior { void useWeapon(); }
SwordBehavior :一个策略类,只针对一个武器做的具体策略或算法
public class SwordBehavior implements WeaponBehavior{ public void useWeapon() { // TODO Auto-generated method stub //使用剑的操作 } }
King:某一个角色具体子类,在构造器中根据需要来进行更换武器的策略类
public class King extends Character { public King(SwordBehavior sword) { this.weapon=sword; } }
策略模式的优点:动态改变算法或行为,而不影响整体软件系统,体现了多态与组合的特性
策略模式的缺点:客户必须知道所有的策略类,并自行决定使用哪一个策略类,必须对每一个算法了解,不过可以让客户自行定制一些新的策略类
在编程中要掌握一些基本的设计原则:
设计原则:
1)找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
2)针对接口编程,而不是针对具体编程,真正的意思则就是“针对超类型编程”
3)多用组合,少用继承
本文出自 “在云端的追梦” 博客,请务必保留此出处http://computerdragon.blog.51cto.com/6235984/1122822
相关文章推荐
- java设计模式初步探索(策略模式)
- java设计模式之——策略模式
- java 设计模式之策略模式
- java设计模式之行为型模式-策略模式
- JAVA设计模式之策略模式
- java设计模式——策略模式
- JAVA设计模式之策略模式
- java 设计模式之策略模式
- 2014-7-29 Java 设计模式——策略模式
- Java设计模式之-策略模式
- Java设计模式之策略模式
- java设计模式之策略模式及项目中的应用
- Java设计模式--策略模式
- Java设计模式 - 策略模式
- Java设计模式之二——策略模式
- JAVA设计模式四策略模式
- 通俗易懂java设计模式——策略模式(Strategy)
- Java设计模式透析--策略模式(一)
- java设计模式之——策略模式