Java 设计模式--策略模式

时间:2022-04-19 22:00:47

  最近看Head Frist设计模式一书,对设计模式的一点记录,供自己以后查阅,首先学习的是策略模式,策略模式的好处:策略模式的好处在于你可以动态的改变对象的行为
策略模式的设计原则:将一个类中经常改变或者可能要改变的部分提取出来作为一个接口,然后在类中声明这个接口的实例,声明方法可以改变这个实例,这样类就可以调用实现这个接口类的方法。


就以书中例子说明:
     我们有父类鸭子(Duck),鸭子有很多,如正常的鸭子,橡皮鸭子,鸭子共同点:身体两只腿,颜色,行为(飞,叫),因为有些鸭子是会飞的,有些不会飞,有些会呱呱叫,有些会吱吱叫,那么鸭子的行为就是变化的,因此我们抽取这些变化的部分作为接口。
飞行接口:
public interface IFly {
    public void fly();
}
叫接口:
public interface IQuack {
    public void quack();
}
父类Duck:
public abstract class Duck {
    private IFly mIFly;
    private IQuack mIQuack;
    public void setmIFly(IFly iFly)
    {
        mIFly=iFly;
    }
    public void setmIQuack(IQuack iQuack)
    {
        mIQuack=iQuack;
    }
    public void exectFly()
    {
        if(mIFly!=null)
            mIFly.fly();
    }
    public void exectQuack()
    {
        if(mIQuack!=null)
               mIQuack.quack();
    }
    public void body()
    {
        System.out.println("I have a body and two legs!");
    }
   
    public abstract void dispaly();
}
子类RedDuck:
public class RedDuak extends Duck {
    @Override
    public void dispaly() {
        System.out.println("I am red duck!");
    }
}
public class EraserDuck extends Duck {
    @Override
    public void dispaly() {
        System.out.println("I am yello duck!");
    }
}
fly行为类:
public class FlyByWings implements IFly {
    @Override
    public void fly() {
        System.out.println("fly by wings!");
    }
}
呱呱叫行为类:
public class GuaGua implements IQuack {
    @Override
    public void quack() {
        System.out.println("gua gua jiao!");
    }
}
吱吱叫行为类:
public class ZhiZhi implements IQuack {
    @Override
    public void quack() {
        System.out.println("zhi zhi jiao!");
    }
}






测试一下:
public static void main(String args[])


{
   Duck readDuck =new ReadDuck();
   readDuck.body();
readDuck.setmIFly(new FlyByWings ());
readDuck.setmIQuack(new GuaGua());
      readDuck.exectQuack();
      readDuck.exectFly();




      Duck  eraserDuck=new EraserDuck();  
      eraserDuck .body();
      eraserDuck.setQuack(new ZhiZhi());
      eraserDuck.exectQuack();
}
这样我们可以动态的改变各种鸭子的行为,例如我们的RedDuck又会叽叽叫,这也说不准,那么我们可以创建JiJi类实现IQuack
JiJi类实现quack方法,把这JiJi类传给RedDuck实例,RedDuck就可以调用JiJi实现的quack()方法实现叽叽叫了。