这篇博文是对前一篇博文《设计模式1:找出应用中可能需要变化之处,把它们独立出来》的一个延伸思考:在鸭子里建立了一堆动态的功能没有用到,太可惜了!假设我们想在鸭子子类中通过“设定方法(setter method)”来设定鸭子的行为,而不是在鸭子的构造器内实例化,那应该如何操作呢?
1.首先我们要在Duck类中加入两个新的方法:
Duck类(Duck.java)(粗体为新加入的两个方法)
- public abstract class Duck {
- FlyBehavior flyBehavior;
- QuackBehavior quackBehavior;
- public Duck(){
- }
- public abstract void display();
- public void performFly(){
- flyBehavior.fly();
- }
- public void performQuack(){
- quackBehavior.quack();
- }
- public void swim(){
- System.out.println("All ducks float, even decoys!");
- }
- public void setFlyBehavior(FlyBehavior fb){
- flyBehavior=fb;
- }
- public void setQuackBehavior(QuackBehavior qb){
- quackBehavior=qb;
- }
- }
2.模仿上一篇中的MallardDuck制作一个新的鸭子类型:模型鸭子(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");
- }
- }
3.同样模仿上一篇的FlyNoWay制作一个新的FlyBehavior类型(FlyRocketPowered.java)
- public class FlyRocketPowered implements FlyBehavior{
- public void fly(){
- System.out.println("I'm flying with a rocket!");
- }
- }
4.接下来才开始比较令人兴奋的地方:改变测试类(MiniDuckSimulator.java),加入模型鸭子,并使模型鸭子具有火箭动力。
- public class MiniDuckSimulator {
- public static void main(String[] args){
- Duck mallard=new MallardDuck();
- mallard.performQuack();
- mallard.performFly();
- mallard.display();
- Duck model=new ModelDuck();
- model.performFly();
- model.setFlyBehavior(new FlyRocketPowered());
- model.performFly();
- model.display();
- }
- }
5.测试结果