受保护变量原则(Protected Variations Principle)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/385 访问。


(1)问题

如何分配职责给对象、子系统和系统,使得这些元素中的变化或不稳定的点不会对其他元素产生不利影响?

(2)方案

找出预计有变化或不稳定的元素,为其创建稳定的“接口”而分配职责。

(3)分析

受保护变化模式简称PV,它是大多数编程和设计的基础,是模式的基本动机之一,它使系统能够适应和隔离变化。它与面向对象设计原则中的开闭原则相对应,即在不修改原有元素(类、模块、子系统或系统)的前提下扩展元素的功能。开闭原则又可称为“可变性封装原则(Principle of Encapsulation of Variation, EVP)”,要求找到系统的可变因素并将其封装起来。如将抽象层的不同实现封装到不同的具体类中,而且EVP要求尽量不要将一种可变性和另一种可变性混合在一起,这将导致系统中类的个数急剧增长,增加系统的复杂度。在具体实现时,为了符合受保护变化模式,我们通常需要对系统进行抽象化设计,定义系统的抽象层,再通过具体类来进行扩展。如果需要扩展系统的行为,无须对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,在不修改已有代码的基础上扩展系统的功能。大多数设计原则和GoF模式都是受保护变化模式的体现。


示例:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/385 访问。

public abstract class Publisher {private List<IReader> _readers = new List<IReader>();public string Name { get; set; }private const string LINE_BREAK ="----------------------------------------" +"----------------------------------------";//文章排版需要,故折成2行public void AttachReader(IReader reader) {if (reader == null) throw new ArgumentNullException();_readers.Add(reader);}public bool DetachReader(IReader reader) {if (reader == null) throw new ArgumentNullException();return _readers.Remove(reader);}protected virtual void OnPublish(Book book, DateTime publishTime) {Console.WriteLine($"{Name} published {book.BookName()} at {publishTime.ToString("yyyy-MM-dd")}.");Console.WriteLine(LINE_BREAK);}public void Publish(Book book, DateTime publishTime) {OnPublish(book, publishTime);foreach (var reader in _readers) {if (reader != null) {reader.Receive(this, book);}}Console.WriteLine(LINE_BREAK);}}

以上代码可在我的 C#设计模式 系列博文中行为型模式下的观察者模式中找到。

通用职责分配软件原则之9-受保护变量原则相关推荐

  1. 通用职责分配软件原则之4-高内聚原则

    高内聚原则(High Cohesion Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/375 访问 ...

  2. 通用职责分配软件原则之7-纯虚构原则

    纯虚构原则(Pure Fabrication Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/381 ...

  3. 通用职责分配软件原则之6-多态原则

    多态原则(Polymorphism Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/379 访问. ...

  4. 通用职责分配软件原则之2-创造者原则

    创造者原则(Creator Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/371 访问. (1)问 ...

  5. 通用职责分配软件原则之1-信息专家原则

    信息专家原则(Information Expert Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/ ...

  6. 通用职责分配软件原则之5-控制器原则

    控制器原则(Controller Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/377 访问. ( ...

  7. 通用职责分配软件原则之3-低耦合原则

    低耦合原则(Low Coupling Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/373 访问. ...

  8. GRASP通用职责分配软件模式

    1.  概述 它的核心思想是"职责分配(Responsibility Assignment)".GRASP提出了几个基本原则,用来解决面向对象设计的一些问题. Craig Larm ...

  9. 通用职责分配软件原则之8-中介原则

    中介原则(Indirection Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/383 访问. ( ...

最新文章

  1. vue中一个组件导入另一个组件
  2. ACM Fellow发文抨击「同行评审」作弊:有「门道」的作者带飞,垃圾论文也能轻松中顶会...
  3. powertoys中文版
  4. Cracking the coding interview--Q1.4
  5. java--JVM--栈帧--JVM及其优化---逃逸技术(堆栈分配方法)(转载)
  6. linux 定时器_定时器: Nodejs 中的 timers
  7. 自动化 测试框架部署(python3+selenium2)
  8. BZOJ 2957 楼房重建 (分块)
  9. 前端如何实现网络速度测试功能_如何通过fiddler的断点功能,来实现不同场景的测试...
  10. Linux中fcntl函数介绍
  11. oppoa79支持手机html,oppo a79驱动
  12. 独自封装windows 10系统详细教程(三)
  13. Kinect2.0相机标定
  14. Win7原版镜像注入USB驱动
  15. 软件工程第一次作业 192402 20194653 徐伟刚
  16. Yuga Labs大举扩张,“猿”宇宙已经不远了?
  17. win10如何改变登陆界面背景
  18. 解决 Maven工程运行报错Failed to clean project: Failed to delete
  19. 高薪诚聘中高级软件工程师
  20. 天宇,snapseed,第六课,静物人像

热门文章

  1. LeetCode 2. Add Two Numbers
  2. 【AI视野·今日Robot 机器人论文速览 第二十八期】Wed, 1 Dec 2021
  3. 【Linux】线程同步之信号量同步
  4. 编码规范二 缩进与注释
  5. sublime编辑器下载与安装过程 2020
  6. PCB中英对照一、 综合词汇
  7. 从地理围栏看物联网安防
  8. mysql replication
  9. ASP.net的地址重写(URLRewriter)实现原理及代码示例
  10. 硬盘安装Windows7--笔记