定义
策略模式(strategy pattern)定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
类图
代码实现
定义飞行/呱呱叫行为的接口,因为飞行行为和呱呱叫行为的实现方式类似,所以本例只贴出飞行行为代码,呱呱叫行为类似。
public interface FlyBehavior {
public void fly();
}
定义具体行为类,实现特定的飞行方式
// 定义不能飞行的行为类
public class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("I can't fly");
}
}
// 定义带翅膀飞行的行为类
public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("I'm flying!!");
}
}
为鸭子定义抽象类Duck,所有具体的鸭子类都继承自Duck。
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
// 定义flyBehavior/quackBehavior域保存鸭子的行为类,
// 具体的飞行/呱呱叫行为可通过setFlyBehavior/setQuackBehavior方法动态设置
public void setFlyBehavior (FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
// 定义抽象方法display(),让每个子类去实现,
// 因为每种鸭子的外观都不一样
abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
// 定义swim()方法,因为所有的鸭子都会游泳,所以放在超类中实现。
public void swim() {
System.out.println("All ducks float, even decoys!");
}
}
实现具体的鸭子类
// 绿头鸭子类
public class MallardDuck extends Duck {
public MallardDuck() {
// 构造时设置默认行为
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
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();
}
public void display() {
System.out.println("I'm a model duck");
}
}
测试启动代码
public class MiniDuckSimulator1 {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performQuack(); // 执行呱呱叫
mallard.performFly(); // 执行飞行
Duck model = new ModelDuck();
model.performFly();
// 运行时修改飞行行为
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}
该模式体现了哪些OO原则
-
封装可能变化的飞行行为和呱呱叫行为,让飞行行为和呱呱叫行为的实现放在单独的类中,独立于客户Duck。
-
Duck类中performFly()/performQuack()针对接口编程,具体的行为方式取决于flyBehavior/quackBehavior的具体类型。
-
flyBehavior/quackBehavior使用组合,使Duck类的飞行行为和呱呱叫行为的实现更具有弹性,并可以在运行时通过setFlyBehavior()/setQuackBehavior()方法动态设置。
本章总结
知道OO基础,并不足以让你设计出良好的系统
良好的OO设计必须具备可复用,可扩展,可维护3个特性
模式可以让我们建造出具有良好OO设计质量的系统
模式被认为是经验证的OO设计经验
模式不是代码,而是针对设计问题的通用解决方案。你可以把它们应用到特定的应用中
模式不是被发明的,而是被发现的
大多数的模式和OO原则,都着眼于软件变化的主题
我们常把系统中会变化的部分抽出来封装
模式让开发人员之间有共享的语言,能够最大化沟通的价值