用NVI(Non-Virtual Interface) 模式强化依赖倒置
来源:互联网 发布:网络环境 搭建 pdf 编辑:程序博客网 时间:2024/04/30 04:16
用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 模式也是基于同样的考虑。只不过不是用继承,而用委托罢了。
- 用NVI(Non-Virtual Interface) 模式强化依赖倒置
- NVI(Non-Virtual Interface )
- 【C++程序设计技巧】NVI(Non-Virtual Interface )
- C++程序的设计机制1:NVI机制(Non-Virtual Interface )
- C++程序的设计机制1:NVI机制(Non-Virtual Interface )
- C++程序的设计机制1:NVI机制(Non-Virtual Interface )
- Linux实现基于Loopback的NVI(NAT Virtual Interface)
- 设计模式<依赖倒置>
- 设计模式-依赖倒置
- 可用NVI模式替换virtual函数继承方式
- 【设计模式】依赖倒置原则
- 设计模式---->依赖倒置原则
- 设计模式:依赖倒置原则
- 【设计模式】依赖倒置原则
- 设计模式之依赖倒置
- 设计模式-依赖倒置原则
- 设计模式--依赖倒置原则
- 设计模式-依赖倒置原则
- 往Blob类型字段插入图片,使用与MySql或者Oracle
- Web应用中读取配置文件
- jfreechart
- flex 中创建一个具有文字提示的文本输入框
- 男人的难处
- 用NVI(Non-Virtual Interface) 模式强化依赖倒置
- jsp:useBean setProperty getProperty
- Interface 和 abstract class 区别
- C#中new关键字的真正含义
- 各种的web页的格式
- 连盐连淮铁路年内开工 灌南通铁路梦想即将实现
- 百分比
- Oracle表空间设计理念
- Subversion简明手册--使用hook