【愚公系列】2021年12月 通用职责分配原则(九)-受保护变量原则(Protected Variations Principle)

简介: 【愚公系列】2021年12月 通用职责分配原则(九)-受保护变量原则(Protected Variations Principle)

文章目录

前言

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

二、使用步骤

示例

前言

GRASP:General Responsibility Assignment Software Patterns 通用职责分配软件模式。


首先我们先来区分下GRASP与GOF模式的区别,它们主要在什么时候用,用来做什么。在软件开发过程中,我们常说面向对象开发,面向对象思想应该贯穿整个软件开发生命周期。我们在将现实世界中的业务对象及业务功能抽象成软件系统中的系统对象过程中应该遵循使用GRASP模式。而在具体技术实现上应该遵循使用GOF设计模式,来实现系统功能。即GRASP主要使用在分析设计阶段,与具体技术无关;而GOF模式主要使用在开发阶段,与具体技术相关,它是对GRASP设计成果进行实现时而使用,是一种开发阶段的设计模式。


GRASP软件设计模式包括9个模式:创建者、信息专家、低耦合、控制器、高内聚、多态性、纯虚构、间接性、防止变异。


提示:以下是本篇文章正文内容,下面案例可供参考


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

(1)问题


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


(2)方案


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


(3)分析


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


二、使用步骤

示例

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#设计模式 系列博文中行为型模式下的观察者模式中找到。


相关文章
|
物联网 Linux 云栖大会
云栖新闻|全球首次系列处理器全栈开源,平头哥推进RISC-V技术走向成熟
10月19日,2021云栖大会现场,阿里云智能总裁张建锋宣布,平头哥开源玄铁RISC-V系列处理器,并开放系列工具及系统软件。这是系列处理器与基础软件的全球首次全栈开源,将推动RISC-V架构走向成熟,帮助RISC-V软硬件技术加速融合发展,推动创新落地。
17000 0
云栖新闻|全球首次系列处理器全栈开源,平头哥推进RISC-V技术走向成熟
|
1天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1277 1
|
8天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
669 4
|
1天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
430 2
|
2天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
|
1天前
|
存储 弹性计算 安全
阿里云服务器4核8G收费标准和活动价格参考:u2a实例898.20元起,计算型c9a3459.05元起
现在租用阿里云服务器4核8G价格是多少?具体价格及配置详情如下:云服务器ECS通用算力型u2a实例,配备4核8G配置、1M带宽及40G ESSD云盘(作为系统盘),其活动价格为898.20元/1年起;此外,ECS计算型c9a实例4核8G配置搭配20G ESSD云盘,活动价格为3459.05元/1年起。在阿里云的当前活动中,4核8G云服务器提供了多种实例规格供用户选择,不同实例规格及带宽的组合将带来不同的优惠价格。本文为大家解析阿里云服务器4核8G配置的实例规格收费标准与最新活动价格情况,以供参考。
219 150