[color=blue][size=large]策略模式: 定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计原则: 多用组合,少用继承。
设计一个Duck 类,由于 Duck的行为 fly quack 是可以变化的,所以将可变化项 fly quack 抽象出来,
[/size][/color]
Duck 类
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior; //为行为接口类型声明两个引用变量,所有//Duck子类都继承它
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
public Duck(){
}
public abstract void display();
public void performFly(){
flyBehavior.fly(); //委托给行为类
}
public void performQuack(){
quackBehavior.quack(); //委托给行为类
}
}
fly 行为接口 FlyBehavior
public interface FlyBehavior {
public void fly();
}
quack 行为接口 QuackBehavior
public interface QuackBehavior {
public void quack();
}
fly实例
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("I'm flying!!");
}
}
Quack实例
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("Quack");
}
}
绿头鸭实例
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack(); //绿头鸭使用Quack类//处理Quack,所以当
// perform Qucak()被调用时,Quack的职责就被委托
// 给Quack对象,儿我们得到了真正的Quack
flyBehavior = new FlyWithWings();
}
@Override
public void display() {
System.out.println("I'm a real Mallard duck");
}
}
测试程序
public class MiniDuckSimulator {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
mallard.setFlyBehavior(new FlyNoWay());//在运行时想改变鸭子的行 //为,只需调用鸭子的Setter方法就可以了
mallard.performFly();
}
}
设计原则: 多用组合,少用继承。
设计一个Duck 类,由于 Duck的行为 fly quack 是可以变化的,所以将可变化项 fly quack 抽象出来,
[/size][/color]
Duck 类
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior; //为行为接口类型声明两个引用变量,所有//Duck子类都继承它
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
public Duck(){
}
public abstract void display();
public void performFly(){
flyBehavior.fly(); //委托给行为类
}
public void performQuack(){
quackBehavior.quack(); //委托给行为类
}
}
fly 行为接口 FlyBehavior
public interface FlyBehavior {
public void fly();
}
quack 行为接口 QuackBehavior
public interface QuackBehavior {
public void quack();
}
fly实例
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("I'm flying!!");
}
}
Quack实例
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("Quack");
}
}
绿头鸭实例
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack(); //绿头鸭使用Quack类//处理Quack,所以当
// perform Qucak()被调用时,Quack的职责就被委托
// 给Quack对象,儿我们得到了真正的Quack
flyBehavior = new FlyWithWings();
}
@Override
public void display() {
System.out.println("I'm a real Mallard duck");
}
}
测试程序
public class MiniDuckSimulator {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
mallard.setFlyBehavior(new FlyNoWay());//在运行时想改变鸭子的行 //为,只需调用鸭子的Setter方法就可以了
mallard.performFly();
}
}