NVI模式
简介:
--NVI即(Non-VIrtual Interface)模式强化依赖倒置,介于 Virtual与No Virtual 之间 允许子类重新实现 也可以在父类中对子类 进行限制和其它操作。
由来:
在架构设计中,我们一般喜欢设计一个基类,然后把未来扩展的工作留给它的派生类做。调用者只能看到基类的方法,不能看到实现类。这里体现了依赖倒置的原则 (DIP)。如果父类想进一步控制子类,没有运用NVI模式的基类是无法做到的。而运用了NVI模式的基类可以轻松完成。
下面我们看一个例子:
写一个教师类,由此教师类派生出个类--分别是 “ 数学老师 ” ,“ 语文老师 ” 。教师类里面提供了一个 " 布置作业 " 的虚方法供其派生重写,此外教师类还有一个教师类型
属性用于对不同教师的操作,还有一个 “上课” 方法 ,该方法用于调用 “ 布置作业 ” 。
教师类:teacher
teacherType //教师属性
Attendclass() //上课方法
SetHomework()//布置作业方法
数学老师:mathTeacher
语文老师:chineseTeacher
--代码实现--
教师类:
public class teacher
{
//教师类型
public string teacherType = "教师";
//上课方法 学校规定 除了数学作业可以不用交 其他 都要交
public void Attendclass(string teachertype)
{
//这里可以写拓展代码对子类做操作
if (teachertype=="数学")
{
Console.WriteLine("数学作业可以不用交!");
}
else
{
SetHomework();
}
}
//布置作业
protected virtual void SetHomework()
{
Console.WriteLine("哇嘎嘎,布置作业咯!");
}
}
这里 SetHomework() 使用 protected 访问限制修饰符 , 我们知道 protected 修饰的字段 只有同类和子类才可以对他进行访问 这么做 是为了允许派生类重写改变实现,同时也使派生类拒绝其他对象对它的监视 。(另外需要补充的是,虚拟 抽象 成员 都不能 用 Private 修饰)
数学老师:
public class mathTeacher : teacher
{
//构造函数 实例化一个对象时候 给其 teacherType 字段 赋值
public mathTeacher()
{
teacherType = "数学";
}
//重写父类 方法
protected override void SetHomework()
{
Console.WriteLine("数学作业:用C语言解决'高斯八皇后问题'。");
}
}
语文老师:
public class chineseTeacher : teacher
{
public chineseTeacher()
{
teacherType = "语文";
} protected override void SetHomework()
{
Console.WriteLine("语文作业:写一篇3K字的作文,明天交。");
}
}
运行:
class Program
{
static void Main(string[] args)
{
mathTeacher mt = new mathTeacher();
mt.Attendclass(mt.teacherType); chineseTeacher ct = new chineseTeacher();
ct.Attendclass(ct.teacherType);
}
}
结果:
数学作业可以不用交!
语文作业:写一篇3k的作文,明天交。
不难发现使用 NVI 模式 对 子类的操作 是非常 轻易 实现的。
NVI模式的更多相关文章
- c++学习_2
这里承接上一篇文章,继续记录关于继承的那些事儿... NVI(non-Virtual Interface)和strategy模式 NVI模式和strategy模式是两种不同的方法,可以用来替代virt ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 彻底理解AC多模式匹配算法
(本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...
- 制作类似ThinkPHP框架中的PATHINFO模式功能
一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
- MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信
MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...
- MVVM模式解析和在WPF中的实现(三)命令绑定
MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- MVVM模式和在WPF中的实现(二)数据绑定
MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
随机推荐
- SpringCloud-断路器(Hystrix)
在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用Rest Template + Ribbon和Feign来调用.为了保证其高可用,单 ...
- c# 继承小结
本文意在巩固基础知识,并不是对其进行深入剖析,如若对各位高手没有什么作用,请绕过.本文为原创文,所有示例均是博主测试过的,欢迎大家批评指正,如有转载请标明出处,谢谢.继承.封装和多态是面向对象编程的重 ...
- UniDAC 的 RecordCount 属性注意事项
一直以来都是用UniDAC作为数据库查询组件,而一般的写法都是这样: UniQuery_sqlite.close; UniQuery_sqlite.SQL.Clear; UniQuery_sqlite ...
- 代码题(3)— 最小的k个数、数组中的第K个最大元素、前K个高频元素
1.题目:输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 快排思路(掌握): class Solution { public ...
- Hibernate学习---第十五节:hibernate二级缓存
1.二级缓存所需要的 jar 包 这三个 jar 包实在 hibernate 解压缩文件夹的 lib\optional\ehcache 目录下 2.配置 ehcache.xml <ehcache ...
- Git_学习_06_ 放弃本地修改
一.未使用 git add 缓存代码时 git checkout -- filepathname // 放弃某个文件 git checkout . // 放弃所有文件 git checkout . 用 ...
- popupTheme和theme
popupTheme是指toolBar中弹出的menu的Theme. 那么,如果想让ToolBar的文字是白色,如果你设置Toolbar的Theme是 "ThemeOverlay.AppCo ...
- freeMarker(十二)——模板语言补充知识
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.特殊变量参考 特殊变量是由FreeMarker引擎自己定义的变量. ...
- 线段树Final版本
结构体是个好东西... 看着逼格很高 #include<iostream> #include<cstdio> #include<cstdlib> #include& ...
- Gym 101142C :CodeCoder vs TopForces(强连通算法)
题意:N个人,每个人有a属性和b属性,如果一个人的a或者b大于另外一个人,我们说这个人可以打败那个人.且这种关系可以传递.对于每个人,输出他可以打败多少人.(保证每个a不相同,保证每个b不相同. 思路 ...