【设计模式系列】行为型模式之Null Object模式

概要
系统中会包含很多行为,有些行为总是存在并需要被执行,而有些行为在某些场合或某种设置下就不希望被执行,通常很多人会通过一些条件对系统行为进行限制来达到目的,但是这样会给本来很简单纯粹的处理增加额外的逻辑,而通过NULL Object模式会提供一个具有代理式的空白行为的对象来解决问题。

目的
通过NULL Object模式提供一个具有代理式的空白行为的对象,从而隐藏一些判断逻辑。

实例
看这样一个例子,系统中有类Action,一些具体行为都从类Action继承来扩展,类Manager会使用Action类型的对象来处理相应的动作。类图和代码如下:
class Action {
public:
     virtual void Execute() = 0;
};
class ConcreteAction : public Action {
public:
     virtual void Execute() {
          ......
     }
};
class Manager {
public:
     Manager(Action* at) {
          mAction = at;
     }
     void DoAction() {
          mAction->Execute();
     }
private:
     Action* mAction;
};

这时发现在某种情况下我们希望DoAction方法中的Action不做任何处理,怎么解决呢?
假设这里所说的某种情况可以用外部的某个变量isAction来进行判断,当值为FALSE时不进行任何处理。很多人会这样去调整代码,首先把isAction通过构造函数传递给Manager类,然后在DoAction中通过判断,当isAction为TRUE时才执行Action:
class Manager {
public:
     Manager(Action* at,  bool isAction) {
          mAction = at;
          mIsAction = isAction;
     }
     void DoAction() {
          if (mAction == TRUE) {
               mAction->Execute();
          }
     }
private:
     Action* mAction;
     bool mIsAction;
};

还有人会觉得应该把isAction的判断加在Action或ConcreteAction类中,让Execute方法自己来判断是否执行。
虽然这样做都可以解决问题,但是却让本来处理很简单职责很单一的Manager或ConcreteAction类增加了额外的逻辑,也让代码看起来不是那么美妙了。看看Null Object模式怎么解决问题吧。
class NullAction : public Action {
public:
     virtual void Execute() {
          // do nothing
     }
};

就是这样,ConcreteAction,Manager和Action类都不需要改,只是追加了NullAction类,而它的Execute方法什么都不做。实际调用的代码如下所示:
Action* at = NULL;
if (isAction == TRUE) {
     at = new ConcreteAction();
} else {
     at = new NULLAction();
}
Manager mng(at);
mng->DoAction();

可见,这样就把isAction相关的逻辑跟Manager或所有Action类都隔离开来了。 

应用
没啥可说的,该用就用。

转载于:https://www.cnblogs.com/secbook/archive/2012/05/24/2655105.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值