策略模式
定义
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
策略模式和共享词汇
设计模式让你和其他开发人员之间有共享的词汇,一旦懂得这些词汇,和其他开发人员之间沟通就很容易,也会促使那些不懂的程序员想开始学习设计模式。设计模式也可以把你的思想架构的层次提高到模式层面,而不是仅停留在琐碎的对象上。
共享模式词汇的威力
- 共享的模式词汇“威力巨大”
- 模式能够让你用更少的词汇做更充分的沟通
- 将说话的方式保持在模式层次,可让你待在“设计圈子”久一点
- 共享词汇可帮你的开发团队快速充电
- 共享词汇能帮助初级开发人员迅速成长
代码实现
- 定义一个飞行行为的接口
public interface FlyBehavior {
void fly();
}
- 赋予飞行行为具体实现
/**
*不会飞
**/
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("I can't fly");
}
}
/**
*通过火箭推进器飞
**/
public class FlyRocketPowered implements FlyBehavior{
@Override
public void fly() {
System.out.println("I'm flying with a rocket");
}
}
/**
*使用翅膀飞
**/
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("I'm flying");
}
}
- 定义一个呱呱叫行为的接口
public interface QuackBehavior {
void quack();
}
- 赋予呱呱叫行为具体实现
/**
*一般的叫声
**/
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("Quack");
}
}
/**
*不会叫
**/
public class MuteQuack implements QuackBehavior{
@Override
public void quack() {
System.out.println("silence");
}
}
/**
*吱吱叫
**/
public class Squeak implements QuackBehavior{
@Override
public void quack() {
System.out.println("Squeak");
}
}
- 定义一个鸭子类
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {}
public abstract void display();
public void performQuack() {
quackBehavior.quack();
}
public void performFly() {
flyBehavior.fly();
}
public void swim() {
System.out.println("All ducks float, even decoys!");
}
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
}
- 定义一个绿头鸭,继承鸭子类,设置叫声和飞行方式
public class MallardDuck extends Duck {
public MallardDuck() {
//一般叫声
quackBehavior = new Quack();
//使用翅膀飞
flyBehavior = new FlyWithWings();
}
public void display() {
System.out.println("I'm a real Mallard duck");
}
}
- 定义一个模型鸭,继承鸭子类,设置叫声和飞行方式
public class ModelDuck extends Duck{
public ModelDuck() {
//不会叫
flyBehavior = new FlyNoWay();
//不会飞
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 mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
System.out.println("----------------------");
Duck model = new ModelDuck();
model.performFly();
//为模型鸭加上火箭推进器
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}
- 输出结果
Quack
I'm flying
----------------------
I can't fly
I'm flying with a rocket