策略模式:定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
代码实现:
(1)定义两个算法族(策略)的接口
public interface FlyBehavior {
void fly();
}
public interface QuackBehavior {
void quack();
}
(2)定义一个接口,采用组合的方式调用相应的算法族(策略)接口。
public abstract class Duck {
FlyBehavior flybehavior;
QuackBehavior quackbehavior;
public Duck(){
}
public void performFly(){
flybehavior.fly();
}
public void performQuack(){
quackbehavior.quack();
}
public void swim(){
System.out.println("All duck float, even decoys");
}
public void setFlyBehavior(FlyBehavior fb){
flybehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb){
quackbehavior = qb;
}
}
(3)继承两个算法族(策略)接口,实现相应的实现类
public class FlyNoWay implements FlyBehavior{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I can't fly.");
}
}
public class FlyRocketPowered implements FlyBehavior{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I am fly with a rocket.");
}
}
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I'm flying.");
}
}
public class MuteQuack implements QuackBehavior{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("<<Silence>>");
}
}
public class Quack implements QuackBehavior{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Quack");
}
}
public class Squeak implements QuackBehavior{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Squeak");
}
}
(4)继承duck接口,实现具体的duck类,实例化不同的算法族(策略)。
public class MallardDuck extends Duck {
public MallardDuck(){
quackbehavior = new Quack();
flybehavior = new FlyWithWings();
}
}
public class ModleDuck extends Duck {
public ModleDuck(){
flybehavior = new FlyNoWay();
quackbehavior = new Quack();
}
public void display(){
System.out.println("I am a modle Duck.");
}
}
(5)测试代码
public class MiniDuckSimulator {
public static void main(String[] args){
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
Duck modle = new ModleDuck();
modle.performFly();
modle.setFlyBehavior(new FlyRocketPowered());
modle.performFly();
}
}