design pattern : 策略模型Strategy

 

策略模型一般用于 在软件构建过程中,某些对象使用的算法可能多种多样,经常发生变化。如果在对象内部实现这些算法,将会使对象变得异常复杂,甚至会造成性能上的负担。  

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();

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值