设计模式之策略模式(java)

       时间长了,以前学习的东西,东挪挪,西移移,如今都不知道被放到了哪个角落。如今再次翻看 《Head First 设计模式》(有兴趣的朋友可以买一本看看),做简单记录,以供大家学习。

       简单来讲呢, 策略模式就是将具体的实现交给子类来做,需要 使用策略的类   直接和抽象层的类或接口交互,而不是直接和具体策略类交互。  

       策略模式一个较为正式的定义:它定义了算法簇,将他们封装起来,算法簇之间可以相互替换,让算法的变化独立于使用算法的客户。

      

      举个例子,不同品种鸭子的叫声是不同的。如“呱呱叫” 、 “吱吱叫”  还有的鸭子不叫(模型鸭子),但他们都可以用 “quack”来描述,每种不同的叫声姑且取名为“Quack”、 “Sqack” 、 “QuackNoWay”  。 现在抽象一个父类(也可能是一个借口)叫做 QuackBehavior , 它有个叫quack的方法。客户需要鸭子鸣叫时就像该方法发送一个消息。经过上述分析得到几个类的关系图如下:

      


      上面一直说到 “客户” 一词 , 那它在此究竟是什么呢?我们上面所说的叫声都是鸭子发出的。 鸭子要如何叫就向QuackBehavior 发送一个quack的消息。鸭子的类图如下:

      

     鸭子和QuackBehavior的关系图如下:

     

     

     说了半天鸭子,鸭子也有具体的品种,不同品种的鸭子叫声是不一样滴(一样滴叫声不考虑了),不同的鸭子我们用以下的类图表示:

     


     最后得到整个类图关系:

    

     注:上图中有包含有飞行方法的接口。

     下面给出每个类的代码,具体的策略就自己diy吧:

     QuackBehavior

public interface QuackBehavior {
   void quack();

}
    QuackNoWay

public class QuackNoWay implements QuackBehavior {
   public void quack() {
   }

}
   Quack

public class Quack implements QuackBehavior {
   public void quack() {
   }

}
   Squack
public class Squack implements QuackBehavior {
   public void quack() {
   }

}
    Duck

public abstract class Duck {

    public Duck() {
    }

    // protected FlyBehavior mFlyBehavior;
    protected QuackBehavior mQuackBehavior;

    public void fly() {
    }

    public void quack() {
        mQuackBehavior.quack();
    }

    public abstract void display();

    // public abstract FlyBehavior setFlyBehavior();
    public void setQuackBehavior(QuackBehavior behavior){
        mQuackBehavior = behavior;
    }

}

   GreenDuck 

   

public class GreenDark extends Duck {
    public GreenDark() {
    }

    @Override
    public void display() {
        System.out.println("I'm a green duck !...");
    }

}
    ModelDuck

    

public class ModelDuck extends Duck {

    public ModelDuck() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void display() {
        System.out.println("I'm a ModelDuck !...");
    }

}
   RocketDuck

public class RocketDuck extends Duck {

    public RocketDuck() {
    }

    @Override
    public void display() {
        System.out.println("I'm a RocketDuck !...");
    }
}

   测试代码

public static void main(String[] args) {

        Duck duck = new GreenDark();
        duck.setQuackBehavior(new QuackNoWay());
        duck.display();
        duck.quack();

    }

  好了,就写到这里吧,更多的测试用例就自己设计了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值