设计模式-策略模式
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
应用场景:根据用户需求处理数据时候需要对算法做出选择,固定的一些算法(不再发生变化的算法)扩展。
备注:
- 观察者模式定义了对象之间的一对多关系。
- 主题(也就是观察者)用一个共同的接口来更新观察者。
- 观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者接口。
- 使用此模式时,你可从被观察者处推(push)或(pull)数据(然而,推的方式被认为更“正确”)。
- 有多个观察者时,不可以依赖特定的通知次序。
- Java有多种观察者模式的实现,包括了通用的java.util.Observable。
- 要注意java.util.Observable实现上所带来的一些问题。
- 如果有必要的话,可以实现自己的Observable,这样不难,不要害怕。
- Swing大量使用观察者模式,许多GUI框架也是如此。
- 此模式也被应用在许多地方,例如:JavaBeans、RMI。
demo:
说明:
duck 封装鸭子各种行为。
QuackBehavior 封装呱呱叫行为。
FlyBehavior 封装飞行行为。
public abstract class Duck { QuackBehavior quackBehavior; FlyBehavior flyBehavior; public Duck() {} public void performQuack(){ quackBehavior.quack(); } public void performFly(){ flyBehavior.fly(); } public void setFlyBehavior(FlyBehavior fb){ flyBehavior = fb; } public void setQuackBehavior(QuackBehavior qb){ quackBehavior = qb; }
public class ModelDuck extends Duck{ public ModelDuck() { flyBehavior = new FlyNoWay(); quackBehavior = new Quack(); } public void display() { System.out.println("I'm a model deuck"); }
public class MallardDuck extends Duck{ public MallardDuck(){ quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); } public void display() { System.out.println("..........I'm a real Mallard duck"); } }
public interface FlyBehavior { /** * 飞行方法 */ void fly(); }
public class FlyRocketPowered implements FlyBehavior{ public void fly() { System.out.println("I'm flying with a rocket!"); } }
public class FlyWithWings implements FlyBehavior{ public void fly() { System.out.println("...飞行,真的会飞的"); } }
public class FlyNoWay implements FlyBehavior{ public void fly() { System.out.println("......不会飞行"); } }
public interface QuackBehavior { /** * 叫方法 */ void quack(); }
public class Quack implements QuackBehavior{ public void quack() { System.out.println("......真的鸭子,呱呱叫"); } }
public class Squeak implements QuackBehavior{ public void quack() { System.out.println("..........橡皮鸭子吱吱叫"); } }
public class MuteQuack implements QuackBehavior{ public void quack() { System.out.println("..........什么都不做,不会叫"); } }
public class Test1 { public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.performQuack(); mallard.performFly(); } }
public class Test2 { public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.performQuack(); mallard.performFly(); System.out.println("--------------------------"); Duck model = new ModelDuck(); model .performFly(); //动态的改变它的飞行行为。 model.setFlyBehavior(new FlyRocketPowered()); model.performFly(); } }