策略模式:
定义了算法簇,别离封装起来,让它们之间能够相互替换,此模式让算法的变动能够独立于算法的客户。
具体实例:
当初咱们要创立各种鸭子对象,这些鸭子有者不同的行为能力,会叫的,会飞的,不会叫的,不会飞的,飞得很快像火箭一样的等等。
咱们首先剖析鸭子的能力次要有两种,叫与飞。因而咱们将这两种能力剥离进去,定义为了接口。叫的差异化在叫的具体行为类来实现。飞的差异化能力在飞的具体类实现。
这样咱们就将接口与实现拆散了。
行为接口就像是一类算法,具体的行为类就是这类算法的差异化实现。当要扩大这类算法时,只须要增加新的行为类。
代码样例:
飞动作的行为接口public interface FlyBehavior { public void fly();}
叫动作的行为接口public interface QuackBehavior { public void quack();}
飞的具体行为类1public class FlyNoWay implements FlyBehavior{ @Override public void fly() { System.out.println("i cant not fly"); }}
飞的具体行为类2public class FlyWithWings implements FlyBehavior{ @Override public void fly() { System.out.println("i am flying"); }}
飞的具体行为类3public class FlyWithRocket implements FlyBehavior{ @Override public void fly() { System.out.println("i am flying with rocket"); }}
叫的具体行为类1public class MuteQuack implements QuackBehavior{ @Override public void quack() { System.out.println("silence"); }}
叫的具体行为类2public class Quack implements QuackBehavior{ @Override public void quack() { System.out.println("quack: gua gua gua"); }}
抽象类Duck是具备叫和航行为的一类对象,咱们将Duck定义为了抽象类,在该类中蕴含了行为接口,通过行为接口对具体行为类的援用(多态),达到了行为的多态实现。
public abstract class Duck { //行为接口 FlyBehavior flyBehavior; QuackBehavior quackBehavior; public void performFly(){ flyBehavior.fly(); } public void performQuack(){ quackBehavior.quack(); } //赋予飞这个具体动作类的援用 public void setterFlyBehavior(FlyBehavior flyBehavior){ this.flyBehavior = flyBehavior; } //赋予叫这个具体动作类的援用 public void setterQuackBehavior(QuackBehavior quackBehavior){ this.quackBehavior = quackBehavior; } public abstract void display();}
鸭子对象:通过构造函数填充鸭子的行为public class ModelDuck extends Duck{ //在鸭子的结构器内实例化鸭子的行为 public ModelDuck(){ this.flyBehavior = new FlyNoWay(); this.quackBehavior = new MuteQuack(); } @Override public void display() { System.out.println("i am a model duck"); }}通过set办法赋予鸭子的行为。public class NewModelDuck extends Duck{ @Override public void display() { System.out.println("i am a new duck"); }}
测试:public class DuckSimulator { public void duckConstructBehavior() { Duck model = new ModelDuck(); model.performFly(); model.performQuack(); } public void duckSetterBehavior(){ Duck newModelDuck = new NewModelDuck(); newModelDuck.setterFlyBehavior(new FlyWithRocket()); newModelDuck.setterQuackBehavior(new Quack()); newModelDuck.performQuack(); newModelDuck.performFly(); }}
import junit.framework.TestCase;public class DuckSimulatorTest extends TestCase { private DuckSimulator duckSimulator = new DuckSimulator(); public void testDuckConstructBehavior() { duckSimulator.duckConstructBehavior(); } public void testDuckSetterBehavior() { duckSimulator.duckSetterBehavior(); }}
测试后果:
i am a model ducki cant not flysilencei am a new duckquack: gua gua guai am flying with rocket