您的位置:首页 > 其它

策略模式

2014-12-11 19:08 113 查看

策略模式:把可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现


找出代码中可变的部分,把他们独立出来
面向接口编程
多用组合,少用继承

优势:

因为使用了组合,使构架更加灵活
富有弹性,可以很好的应对变化(开闭原则)
更好的代码复用性
消除大量的条件语句

劣势:

客户代码需要了解每个策略实现的细节
增加了对象的条目

实现:

代码实例:

我们有一个鸭子的超类:

鸭子有两个行为:飞和叫
不同的鸭子的行为是不同的,也就是说flyBehavior和quackBehavior是代码中可变的部分,将他们独立出来
public abstract class Duck {
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;

public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}

public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}

public void performFly(){
flyBehavior.fly();
}

public void performQuack(){
quackBehavior.quack();
}

public abstract void display();

void swim(){

};
}

定义fly行为的接口   
public interface FlyBehavior {
void fly();
}
定义quack行为的接口
public interface QuackBehavior {
void quack();
}


写一个实现fly接口的行为类  面向接口编程
/*
* 使用火箭飞行
*/
public class FlyRocketPowered implements FlyBehavior{

public void fly() {

System.out.println("i'm fly with a rocket");
}

}
写一个实现quack接口的行为类 面向接口编程
/**
* 实现呱呱叫
* @author yang
*
*/
public class Quack implements QuackBehavior{

public void quack() {

System.out.println("实现呱呱叫");
}

}


写一个ModelDuck类实现抽象原始类Duck  使用聚合
public class ModelDuck extends Duck{

public ModelDuck() {
flyBehavior = new FlyRocketPowered();
quackBehavior = new Quack();
}

@Override
public void display() {
System.out.println("i'm a model duck");
}
}
测试代码
public class MiniDuckSimulator {
public static void main(String[] args) {
Duck model = new ModelDuck();
model.performQuack();
model.performFly();

model.setFlyBehavior(new FlyNoWay());
model.performFly();

model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: