天天看點

設計模式(DesignPattern)之政策模式(Strategy)

Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides

OO原則是我們的目标,而設計模式是我們的做法。

把模式裝進腦子裡,然後在你的設計和已有的應用中,尋找何處可以使用它們。

除非你很積極地讓神經元活動起來,否則你的頭腦裡什麼也不會發生。

學得更快、更深入,集中注意力,怎樣思考的?學習方法?

設計模式(DesignPattern)之政策模式(Strategy)

Dog d  =   new  Dog();

設計模式(DesignPattern)之政策模式(Strategy)

d.bark();

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

Animal animal  =   new  Dog();

設計模式(DesignPattern)之政策模式(Strategy)

annimal.bark();

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

a  =  getAnimal();

設計模式(DesignPattern)之政策模式(Strategy)

a.makeSound();

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   class  Duck  ... {

設計模式(DesignPattern)之政策模式(Strategy)

    QuackBehavior quackBehavior;

設計模式(DesignPattern)之政策模式(Strategy)

    //還有更多

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public void performQuack() ...{

設計模式(DesignPattern)之政策模式(Strategy)

        quackBehavior.quack();

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   class  MallardDuck  extends  Duck  ... {

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public MallardDuck() ...{

設計模式(DesignPattern)之政策模式(Strategy)

        quackBehavior = new Quack();

設計模式(DesignPattern)之政策模式(Strategy)

        flyBehavior = new FlyWithWings();

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public display() ...{

設計模式(DesignPattern)之政策模式(Strategy)

        System.out.println("I'm a real Mallard duck");

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   abstract   class  Duck  ... {

設計模式(DesignPattern)之政策模式(Strategy)

    FlyBehavior flyBehavior;

設計模式(DesignPattern)之政策模式(Strategy)

    QuackBehavior quackbehavior;

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public Duck() ...{

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public abstract void display();

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public void peformFly() ...{

設計模式(DesignPattern)之政策模式(Strategy)

        flyBehavior.fly();

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public void peformQuack() ...{

設計模式(DesignPattern)之政策模式(Strategy)

        quackBehavior.quack();

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public void swim() ...{

設計模式(DesignPattern)之政策模式(Strategy)

        System.out.println("All ducks float, even decoys!");

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   interface  FlyBehavior  ... {

設計模式(DesignPattern)之政策模式(Strategy)

    public void fly();

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   class  FlyWithWings  implements  FlyBehavior  ... {

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public void fly() ...{

設計模式(DesignPattern)之政策模式(Strategy)

        System.out.println("I'm flying!");

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   class  FlyNoWay  implements  FlyBehavior  ... {

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public void fly() ...{

設計模式(DesignPattern)之政策模式(Strategy)

        System.out.println("I can't fly");

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   interface  QuackBehavior  ... {

設計模式(DesignPattern)之政策模式(Strategy)

    public void quack();

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   class  Quack  implements  QuackBehavior  ... {

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public void quack() ...{

設計模式(DesignPattern)之政策模式(Strategy)

        System.out.println("Quack");

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   class  MuteQuack  implements  QuackBehavior  ... {

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public void quack() ...{

設計模式(DesignPattern)之政策模式(Strategy)

        System.out.println("Squeak");

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

-->

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   class  MiniDuckSimulator  ... {

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public static void main(String[] args) ...{

設計模式(DesignPattern)之政策模式(Strategy)

        Duck mallard = new MallardDuck();

設計模式(DesignPattern)之政策模式(Strategy)

        mallard.performQuack();

設計模式(DesignPattern)之政策模式(Strategy)

        mallard.performFly();

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)

==>

設計模式(DesignPattern)之政策模式(Strategy)

Quack

設計模式(DesignPattern)之政策模式(Strategy)

I ' m flying!

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

#動态設定行為

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   void  setFlyBehavior(FlyBehavior fb)  ... {

設計模式(DesignPattern)之政策模式(Strategy)

    flyBehavior = fb;

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   void  setQuackBehavior(QuackBehavior qb)  ... {

設計模式(DesignPattern)之政策模式(Strategy)

    quackBehavior = qb;

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   class  ModelDuck  extends  Duck  ... {

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public ModelDuck() ...{

設計模式(DesignPattern)之政策模式(Strategy)

        flyBehavior = new FlyNoWay();

設計模式(DesignPattern)之政策模式(Strategy)

        quackBehavior = new Quack();

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public void display() ...{

設計模式(DesignPattern)之政策模式(Strategy)

        System.out.println("I'm a model duck");

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   class  FlyRocketPowered  implements  FlyBehavior  ... {

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public void fly() ...{

設計模式(DesignPattern)之政策模式(Strategy)

        System.out.println("I'm flying with a rocket!");

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

public   class  MiniDuckSimulator  ... {

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

    public static void main(String[] args) ...{

設計模式(DesignPattern)之政策模式(Strategy)

        Duck mallard = new MallardDuck();

設計模式(DesignPattern)之政策模式(Strategy)

        mallard.performQuack();

設計模式(DesignPattern)之政策模式(Strategy)

        mallard.performFly();

設計模式(DesignPattern)之政策模式(Strategy)
設計模式(DesignPattern)之政策模式(Strategy)

        Duck model = new ModelDuck();

設計模式(DesignPattern)之政策模式(Strategy)

        model.performFly();

設計模式(DesignPattern)之政策模式(Strategy)

        model.setFlyBehavior(new FlyRocketPowered());

設計模式(DesignPattern)之政策模式(Strategy)

        model.performFly();

設計模式(DesignPattern)之政策模式(Strategy)

    }

設計模式(DesignPattern)之政策模式(Strategy)

}

設計模式(DesignPattern)之政策模式(Strategy)

==>

設計模式(DesignPattern)之政策模式(Strategy)

Quack

設計模式(DesignPattern)之政策模式(Strategy)

I ' m flying!

設計模式(DesignPattern)之政策模式(Strategy)

I can ' t fly

設計模式(DesignPattern)之政策模式(Strategy)

I ' m flying with a rocket!

時刻思考着:模式如何依賴基礎與原則

OO原則:

1.找出應用中可能需要變化之處,把他們獨立出來,不要和那些不需要變化的代碼混在一起。

把會變化的部分取出并封裝起來,以便以後可以輕易地改動或擴充此部分,而不影響不需要變化的其他部分。

2.針對接口程式設計,而不是針對實作程式設計。

3.多用組合,少用繼承。