一、什么是策略者模式
策略者模式是一种解决 改变 的方案,其核心是将问题剥离,把不会改变的和可变的内容区分开来。在发生改变时只需修改可变的类,即可在改动程序时产生最小的影响。并使用组合将 不变的与可变的组合起来。使程序易扩展和可维护。
二 、策略者模式解决了什么问题
在软件开发中最常见的问题就是改变,策略者模式可以解决“改变”的问题。
在开发中可能会经常遇到需求改变的问题,因此我们在设计类时应充分考虑未来可能发生的扩展。比如为已经上线的某个模块中为某个功能进行扩展,使用策略者设计模式在上线前设计未来可能发生扩展的类,将原始类与扩展类分离使用组合,使得在修改一处时对整体功能不会产生很大的影响,而不会使程序在修改后牵一发动全身,变得难以修改和维护。
三、策略者模式思维图
四、策略者模式的示例
这里使用《head:first设计模式》一书中经典的 Duck 例子阐述。
解析相同与不同:
相同:(不变处)
鸭子们都有颜色,都会游泳。
不同:(可变处)
鸭子们有的吱吱叫有的呱呱叫。有的会飞有的不会飞。
不变
首先设计“不变的类”因为其子类们依然有不同处所以将类声明为抽象类
/*设计一个鸭子超类,使用组合的方式将不变的与改变的组合在一起*/
public abstract class Duck {
/*---------------------可变的----------------------*/
/*将可变的声明为属性*/
public FlyBehavior flyBehavior;
public QuackBehavior quackBehavior;
/*---------------------不变的-----------------------*/
/*提供颜色*/
public abstract void colour();//每一种鸭子都有不同的颜色
/*提供游泳*/
public void swim(){
System.out.println("我在游泳");
}
/*-------------------提供对可变得,进行修改的方法-------------------------*/
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
/*-------------------使用 *可变* 的-------------------------*/
/*为鸭子提供飞行行为*/
public void performFlying(){
flyBehavior.flying();
}
/*为鸭子提供叫的行为*/
public void performQuack(){
quackBehavior.quack();
}
}
可变
设计叫声行为接口
public interface QuackBehavior {
/*设计叫的抽象方法*/
void quack();
}
设计叫声行为的两个实现类
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("嘎嘎叫........");
}
}
public class Squeak implements QuackBehavior {
@Override
public void quack() {
System.out.println("吱吱叫............");
}
}
设计飞行行为接口
/*飞行接口*/
public interface FlyBehavior {
/*设计飞行的抽象方法*/
void flying();
}
设计飞行行为的两个实现类
public class FlUpward implements FlyBehavior {
@Override
public void flying() {
System.out.println("向上飞行..........");
}
}
public class FlyForward implements FlyBehavior {
@Override
public void flying() {
System.out.println("向前飞行......");
}
}
实现一个鸭子类
/*实现一个绿头鸭子 子类*/
public class GreenDuck extends Duck {
/*在创建鸭子类时 为鸭子指定默认行为*/
public GreenDuck(){
flyBehavior = new FlUpward();
quackBehavior = new Quack();
}
/*鸭子的颜色实现*/
@Override
public void colour() {
System.out.println("我是绿色飞鸭子");
}
}
测试
public class test {
public static void main(String[] args) {
GreenDuck greenDuck = new GreenDuck();
/*鸭子的颜色*/
greenDuck.colour();//我是绿色飞鸭子
/*鸭子在游泳*/
greenDuck.swim();//我在游泳
/*动态的指定鸭子以那种方式飞行*/
greenDuck.setFlyBehavior(new FlyForward());
/*调用飞行*/
greenDuck.performFlying();//向上飞行..........
/*动态的指定鸭子的叫声*/
greenDuck.setQuackBehavior(new Squeak());
/*调用名叫*/
greenDuck.performQuack();//嘎嘎叫........
}
}
五、策略者模式中的设计原则
针对接口编程而不是针对实现编程。
找出应用中可能需要变化之处,把他们独立起来, 不要和那些不需要变化的代码混在一起。
多用组合少用继承
六 、关键词
分离 组合 动态指定