Head First设计模式-策略模式

一、整体代码

       Duck.java

public abstract class Duck {
   public  FlyBehavior flyBehavior;

   public QuackBehavior quackBehavior;

   public Duck() {

   }

   public abstract void display();
   public void performFly() {

      flyBehavior.fly();
   }

   public void performQuack() {
      quackBehavior.quack();
   }

   public void setFlyBehavior(FlyBehavior fb) {
      flyBehavior = fb;
   }

   public void setQuackBehavior(QuackBehavior qb) {
      quackBehavior = qb;
   }

   public void swim() {
      System.out.println("All ducks float, even decoys!");
   }
}

      ModelDuck.java

public class ModelDuck extends Duck {

    public ModelDuck() {

       flyBehavior = new FlyNoWay();
       quackBehavior = new Quack();
    }

    public void display() {
       System.out.println("I’m a model duck");
    }
}

        ModelDuckSimulator.java

public class ModelDuckSimulator{
        public static void main(String args[]){
                Duck modelDuck = new ModelDuck();
                modelDuck.performFly();
                modelDuck.performQuack();
        }
}

        FlyBehavior.java

public interface FlyBehavior {
   public void fly();
}

       FlyNoWay.java

public class FlyNoWay implements FlyBehavior {
   public void fly() {
       System.out.println("I can’t fly");
   }
}

      FlyWithWings.java

public class FlyWithWings implements FlyBehavior {
   public void fly() {
         System.out.println("I’m flying!!");
   }
}


      QuackBehavior.java

public interface QuackBehavior {
   public void quack();
}

      Squeak.java

public class Squeak implements QuackBehavior {
   public void quack() {
              System.out.println("Squeak");
   }
}

      Quack.java

public class Quack implements QuackBehavior {
   public void quack() {
        System.out.println("Quack");
   }

}

      MuteQuack.java

public class MuteQuack implements QuackBehavior {
   public void quack() {
              System.out.println("<< Silence >>");
   }
}

二、解释

       1、什么时候用策略模式

       答:当一个接口在不同类中有着不同的实现时,考虑用策略模式。

       2、Squeak.java代码可以复用。如果只在一个类中实现QuackBehavior,那么另一个类如果要实现,则可以复用Squeak.java代码。

       3、OO原则:

       封装变化:    Flyable与Quackable接口一开始似乎还挺不错,解决了问题(只有会飞的鸭子才继承Flyable),但是Java接口不具有实现代码,所以继承接口无法达到代码的复用。这意味着:无论何时你需要修改某个行为,你必须得往下追踪并在每一个定义此行为的类中修改它,一不小心,可能会造成新的错误!所以把该部分代码独立起来了。

       面向接口编程:flyBehavior.fly(); quackBehavior.quack();都是面向接口编程。

       多用组合少用继承:

        Duck类中的这些类都是组合,换一个句话说,想在一个类中使用另一个类的方法和属性,一是继承,另一个是组合。要多用组合。

        public  FlyBehavior flyBehavior;

        public QuackBehavior quackBehavior;

       4、策略模式:定义算法族,分别封装起来,让他们可以相互替换,此模式让算法变化独立于算法客户。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值