通用职责分配软件原则之9-受保护变量原则
受保护变量原则(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-受保护变量原则相关推荐
- 通用职责分配软件原则之4-高内聚原则
高内聚原则(High Cohesion Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/375 访问 ...
- 通用职责分配软件原则之7-纯虚构原则
纯虚构原则(Pure Fabrication Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/381 ...
- 通用职责分配软件原则之6-多态原则
多态原则(Polymorphism Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/379 访问. ...
- 通用职责分配软件原则之2-创造者原则
创造者原则(Creator Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/371 访问. (1)问 ...
- 通用职责分配软件原则之1-信息专家原则
信息专家原则(Information Expert Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/ ...
- 通用职责分配软件原则之5-控制器原则
控制器原则(Controller Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/377 访问. ( ...
- 通用职责分配软件原则之3-低耦合原则
低耦合原则(Low Coupling Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/373 访问. ...
- GRASP通用职责分配软件模式
1. 概述 它的核心思想是"职责分配(Responsibility Assignment)".GRASP提出了几个基本原则,用来解决面向对象设计的一些问题. Craig Larm ...
- 通用职责分配软件原则之8-中介原则
中介原则(Indirection Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/383 访问. ( ...
最新文章
- vue中一个组件导入另一个组件
- ACM Fellow发文抨击「同行评审」作弊:有「门道」的作者带飞,垃圾论文也能轻松中顶会...
- powertoys中文版
- Cracking the coding interview--Q1.4
- java--JVM--栈帧--JVM及其优化---逃逸技术(堆栈分配方法)(转载)
- linux 定时器_定时器: Nodejs 中的 timers
- 自动化 测试框架部署(python3+selenium2)
- BZOJ 2957 楼房重建 (分块)
- 前端如何实现网络速度测试功能_如何通过fiddler的断点功能,来实现不同场景的测试...
- Linux中fcntl函数介绍
- oppoa79支持手机html,oppo a79驱动
- 独自封装windows 10系统详细教程(三)
- Kinect2.0相机标定
- Win7原版镜像注入USB驱动
- 软件工程第一次作业 192402 20194653 徐伟刚
- Yuga Labs大举扩张,“猿”宇宙已经不远了?
- win10如何改变登陆界面背景
- 解决 Maven工程运行报错Failed to clean project: Failed to delete
- 高薪诚聘中高级软件工程师
- 天宇,snapseed,第六课,静物人像