策略模型一般用于 在软件构建过程中,某些对象使用的算法可能多种多样,经常发生变化。如果在对象内部实现这些算法,将会使对象变得异常复杂,甚至会造成性能上的负担。
GoF《设计模式》中说道:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。该模式使得算法可独立于它们的客户变化。
以一个简单的例子来说明:
有家蛋糕点,蛋糕分为两种,有糖和没糖(现在就两种,但以后会添加更多分类,有奶油和没奶油的...
先定义cake的种类,这是对象蛋糕的基本行为
public interface Icake {
public void suger();
// public String discount();
}
有糖:
class withSuger implements Icake{
//Icake cake1;
public void suger(){
System.out.println("this cake is with suger!");
}
public String discount(){
return "no discount";
}
}
无糖:
class withoutSuger implements Icake{
//Icake cake2;
public void suger(){
System.out.println("this cake is no suger!");
}
public String discount(){
return " have discount ";
}
}
蛋糕的抽象类,也是面向客户的直接界面
public abstract class Cake {
Icake suger;
public Cake(){
}
public void chechSuger(){
suger.suger();
}
}
蛋糕一种之菠萝包
public class Boluobao extends Cake{
public Boluobao(){
suger = new withSuger();
}
}
写test,看菠萝包,有糖.....(可扩展其他行为,如保质期长/保质期短)
Cake b1 = new Boluobao();
b1.chechSuger();
要改变的话,可以在cake里加入
pulic void setSuger(Icake change){
this.suger = change;
}
在test中
b1.setSuger(new withoutSuger());
head first里的作业,实现其代码,不解释了
public interface WaeponBehavior {
public void useweapon();
}
class KnifeBehavior implements WaeponBehavior{
public void useweapon(){
System.out.println("I am using a knife!");
}
}
class BowAndArrowBehavior implements WaeponBehavior{
public void useweapon(){
System.out.println("i am using a Bow and Arrow");
}
}
class AxeBehavior implements WaeponBehavior{
public void useweapon(){
System.out.println("i am using a Axe");
}
}
class SwordBehavior implements WaeponBehavior{
public void useweapon(){
System.out.println("i am using a Sword");
}
}
public abstract class Character {
WaeponBehavior waepon;
PersonDetail personal;
public void setWaepon(WaeponBehavior w){
this.waepon = w;
}
public void Fight(){
waepon.useweapon();
}
}
class King extends Character{
public King(){
waepon = new AxeBehavior();
}
}
class Queen extends Character{
public Queen(){
waepon = new BowAndArrowBehavior();
}
}
class Knight extends Character{
public Knight(){
waepon = new SwordBehavior();
}
}
class Troll extends Character{
public Troll(){
waepon = new KnifeBehavior();
}
}
Character englandKing = new King();
Character franceKing = new King();
englandKing.Fight();
franceKing.Fight();
englandKing.setWaepon(new SwordBehavior());
englandKing.Fight();