使用场景:
- 策略模式建议找出负责用许多不同方式完成特定任务的类, 然后将其中的算法抽取到一组被称为策略的独立类中。
- 名为上下文的原始类必须包含一个成员变量来存储对于每种策略的引用。 上下文并不执行任务, 而是将工作委派给已连接的策略对象。
- 上下文不负责选择符合任务需要的算法------客户端会将所需策略传递给上下文。
》》》实现行为类的组合替换。
策略模式代码
定义飞的行为类
public interface FlyBehavior {
public void fly();
}
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
System.out.println("用翅膀飞");
}
}
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("不会飞");
}
}
定义叫的行为类
public interface QuackBehaivor {
public void quack();
}
public class Quack implements QuackBehaivor {
@Override
public void quack() {
System.out.println("呱呱叫");
}
}
public class MuteQuack implements QuackBehaivor {
@Override
public void quack() {
System.out.println("不会叫");
}
}
定义上下文对象超类,鸭子类
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehaivor quackBehavior;
public abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("所有的鸭子都会漂浮");
}
// 动态设置飞行行为
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
//动态设置叫的行为
public void setQuackBehavior(QuackBehaivor quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
定义鸭子实现类
public class MallardDuck extends Duck {
@Override
public void display() {
System.out.println("我是绿头鸭");
}
}
启动类demo
public class MiniDuckSimulator {
public static void main(String []args) {
Duck mallard = new MallardDuck();
mallard.setFlyBehavior(new FlyWithWings());//用翅膀飞
mallard.setQuackBehavior(new Quack());//呱呱叫
mallard.performFly();
mallard.performQuack();
}
}