加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

用NVI(Non-Virtual Interface) 模式强化依赖倒置

发布时间:2020-12-13 20:30:44 所属栏目:百科 来源:网络整理
导读:用NVI(Non-Virtual Interface) 模式强化依赖倒置 黄国强 2009-8-20 先看示例代码。 1) 没有运用NVI模式的Base class Base { public : virtual void Work(void) = 0; }; class Derived : public Base { private: virtual void Work(void) { // 代码写在这里

用NVI(Non-Virtual Interface) 模式强化依赖倒置
黄国强 2009-8-20 先看示例代码。 1) 没有运用NVI模式的Base class Base { public : virtual void Work(void) = 0; }; class Derived : public Base { private: virtual void Work(void) { // 代码写在这里 } }; 2) 运用了NVI模式的Base class Base { public : void Work(void){DoWork();} private: virtual void DoWork(void) = 0; }; class Derived : public Base { private: virtual void DoWork(void) { // 代码写在这里 } }; NVI模式的,我最早见于微软的的代码(当然,可能不是微软发明的),即任何非虚的成员函数,比如Func(),都调用了一个纯虚的Dofunc()。 第一次看到的人一定非常奇怪,为什么要这样设计呢,毕竟Work()函数除了简单的调用了DoWork()外似乎什么都没干。下面就这个设计的意图解释一下: 在架构设计中,我们一般喜欢设计一个基类,然后把未来扩展的工作留给继承类做。调用者只能看到基类,不能看到实现类。这里体现了依赖倒置的原则 (DIP)。如果Base想进一步控制Derived,没有运用NVI模式的Base是无法做到的。而运用了NVI模式的Base却可以。 那么什么时候Base需要Base控制Derived了。请看下面的代码。 class Base { public : void Work(void) { ... // <-此处可以加入扩展代码 DoWork(); ... // <-此处可以加入扩展代码 } private: virtual void DoWork(void) = 0; }; 显然,这里为我们未来的变化留下了一个位置。顺便说一下,PIMPL 模式也是基于同样的考虑。只不过不是用继承,而用委托罢了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读