策略模式-java实现

策略模式: 定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计原则: 多用组合,少用继承。

设计一个Duck 类,由于 Duck的行为 fly  quack 是可以变化的,所以将可变化项 fly quack 抽象出来,

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();

}

}

你可能感兴趣的:(设计模式)