简介:

--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模式的更多相关文章

  1. c++学习_2

    这里承接上一篇文章,继续记录关于继承的那些事儿... NVI(non-Virtual Interface)和strategy模式 NVI模式和strategy模式是两种不同的方法,可以用来替代virt ...

  2. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  3. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  4. 制作类似ThinkPHP框架中的PATHINFO模式功能

    一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...

  5. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  6. MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

    MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...

  7. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  8. MVVM模式和在WPF中的实现(二)数据绑定

    MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  9. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

随机推荐

  1. RabbitMQ之Exchange Topics模式

    说明:此模式实在路由key模式的基础上,使用了通配符来管理消费者接收消息.生产者P发送消息到交换机X,type=topic,交换机根据绑定队列的routing key的值进行通配符匹配: 符号#:匹配 ...

  2. 在unigui中为组件添加hint

    //改变hint的样式procedure TUniForm1.UniFormShow(Sender: TObject);var i: Integer;begin for I := 0 to Self. ...

  3. 格式化namenode时 报错 No Route to Host from node1/192.168.1.111 to node3:8485 failed on socket timeout exception: java.net.NoRouteToHostException: No route to host

    // :: FATAL namenode.NameNode: Failed to start namenode. org.apache.hadoop.hdfs.qjournal.client.Quor ...

  4. IntelliJ IDEA Sringboot 项目部署到外部Tomcat服务器

    <packaging>war</packaging> 添加依赖 <dependency> <groupId>org.springframework.bo ...

  5. HIVE- 数据倾斜

    数据倾斜就是由于数据分布不均匀,数据大量集中到一点上,造成数据热点.大多数情况下,分为一下三种情况: 1.map端执行比较快,reduce执行很慢,因为partition造成的数据倾斜. 2.某些re ...

  6. GW知识点

    1.取值: protected void Button1_Click(object sender, EventArgs e) { string str = ""; foreach ...

  7. python遍历并获取对象属性--dir(),__dict__,getattr,setattr

    一.遍历对象的属性: 1.dir(obj) :返回对象的所以属性名称字符串列表(包括属性和方法). for attr in dir(obj): print(attr) 2.obj.__dict__:返 ...

  8. Mybatis学习--Mapper XML文件

    学习笔记,选自Mybatis官方中文文档:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#insert_update_and_delete My ...

  9. LeetCode Majority Element I

    原题链接在这里:https://leetcode.com/problems/majority-element/ 题目: Given an array of size n, find the major ...

  10. box head上身旋转问题

    现有资源: 1.可旋转上身的动画,旋转角度左右各90度. 2.下身没有旋转动画(腿部左转右转动画) 使用场景: 1.整个模型随鼠标位置旋转,不使用上身旋转动画. 缺点:人物转向动画僵硬.  解决方案: ...