策略模式:
定义了算法簇,别离封装起来,让它们之间能够相互替换,此模式让算法的变动能够独立于算法的客户。
具体实例:
当初咱们要创立各种鸭子对象,这些鸭子有者不同的行为能力,会叫的,会飞的,不会叫的,不会飞的,飞得很快像火箭一样的等等。
咱们首先剖析鸭子的能力次要有两种,叫与飞。因而咱们将这两种能力剥离进去,定义为了接口。叫的差异化在叫的具体行为类来实现。飞的差异化能力在飞的具体类实现。
这样咱们就将接口与实现拆散了。
行为接口就像是一类算法,具体的行为类就是这类算法的差异化实现。当要扩大这类算法时,只须要增加新的行为类。
代码样例:
飞动作的行为接口
public interface FlyBehavior {public void fly();
}
叫动作的行为接口
public interface QuackBehavior {public void quack();
}
飞的具体行为类 1
public class FlyNoWay implements FlyBehavior{
@Override
public void fly() {System.out.println("i cant not fly");
}
}
飞的具体行为类 2
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {System.out.println("i am flying");
}
}
飞的具体行为类 3
public class FlyWithRocket implements FlyBehavior{
@Override
public void fly() {System.out.println("i am flying with rocket");
}
}
叫的具体行为类 1
public class MuteQuack implements QuackBehavior{
@Override
public void quack() {System.out.println("silence");
}
}
叫的具体行为类 2
public 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 duck
i cant not fly
silence
i am a new duck
quack: gua gua gua
i am flying with rocket