设计模式学习笔记1:策略模式

原创
2012/12/11 11:59
阅读数 39

目标:鸭子有不同种类,会不同的叫法和飞法,都会游泳,可以显示。能动态改变叫法和飞法

public interface FlyBehaviour {
    void fly();
}

--------------------------------------

public interface QuackBehaviour {
    void quack();
}

----------------------------------------

public class Duck {
    FlyBehaviour flyBehaviour;
    QuackBehaviour quackBehaviour;
    void performFly(){
        flyBehaviour.fly();
    }
    void performQuack(){
        quackBehaviour.quack();
    }
    void display(){
        System.out.println("I'm a duck");
    }
}
-------------------------------------

public class FlyWithWing implements FlyBehaviour {
    @Override
    public void fly(){
        System.out.println("fly with wing");
    }
}
------------------------------------------

public class Quack implements QuackBehaviour{
    @Override
    public void quack() {
        System.out.println("Quack, quack, quack !");
    }

}

------------------------------------------------

public class MallarDuck extends Duck {
    public MallarDuck(){
        this.flyBehaviour=new FlyWithWing();
        this.quackBehaviour=new Quack();
    }
    void display(){
        System.out.println("I'm a mallar duck");
    }
}
----------------------------------------------

public class Farm {
    public void Farm(){
       
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        Duck duck=new MallarDuck();
        duck.display();
        duck.performFly();
        duck.performQuack();

    }

}

===========================

result:

I'm a mallar duck
fly with wing
Quack, quack, quack !

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

让不同的鸭子会叫会飞,把具体行为的实现抽离出超类,行为作为接口变量存在于超类中,超类不需理会其行为的不同。

多用组合,少用继承

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

改进:动态改变鸭子行为

public class Duck {
    FlyBehaviour flyBehaviour;
    QuackBehaviour quackBehaviour;
    void performFly(){
        flyBehaviour.fly();
    }
    void performQuack(){
        quackBehaviour.quack();
    }
    void display(){
        System.out.println("I'm a duck");
    }
    void swim(){
        System.out.println("I can swim ,'cause I'm a duck");
    }
    //can change behavior!
    public void setFlyBehaviour(FlyBehaviour flyBehaviour) {
        this.flyBehaviour = flyBehaviour;
    }
    public void setQuackBehaviour(QuackBehaviour quackBehaviour) {
        this.quackBehaviour = quackBehaviour;
    }
   
}

-------------------------------------------------------------------
public class DuckModule extends Duck {
    public DuckModule(){
        flyBehaviour=new FlyNoWay();
        quackBehaviour=new Quack();
    }
    public void display(){
        System.out.println("I'm a module duck");
    }
}
----------------------------------------------------------

public class FlyNoWay implements FlyBehaviour{
    @Override
    public void fly() {
        //Unable to fly
        System.out.println("I can't fly");
    }

}

-----------------------------------------------------------
public class FlyRocketPowered implements FlyBehaviour{
    @Override
    public void fly() {
        System.out.println("I'm flying with a rocket!");
    }

}

-------------------------------------------------------
public class Farm {
    public void Farm(){
       
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        Duck moduleDuck=new DuckModule();
        moduleDuck.display();
        moduleDuck.performFly();
        moduleDuck.performQuack();
        moduleDuck.setFlyBehaviour(new FlyRocketPowered());
        moduleDuck.performFly();       
    }

}

=============================

result:

I'm a module duck
I can't fly
Quack, quack, quack !
I'm flying with a rocket!

==============================

策略模式(Strategy Pattern)定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户


 

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部