【愚公系列】2021年12月 通用职责分配原则(六)-多态原则(Polymorphism Principle)

简介: 【愚公系列】2021年12月 通用职责分配原则(六)-多态原则(Polymorphism Principle)

文章目录

前言

一、多态原则(Polymorphism Principle)

二、使用步骤

示例

前言

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


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


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


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


一、多态原则(Polymorphism Principle)

(1)问题


1、如何处理基于类型的不同选择?

2、如何创建可嵌入的软件组件?


(2)方案


当相关选择或行为随类型(类)变化而变化时,用多态操作为行为变化的类型分配职责。


(3)分析


由条件变化引发同一类型的不同行为是程序的一个基本主题。如果用if-else或switch-case等条件语句来设计程序,当系统发生变化时必须修改程序的业务逻辑,这将导致很难方便地扩展有新变化的程序。另外对于服务器/客户端结构中的可视化组件,有时候需要在不影响客户端的前提下,将服务器的一个组件替换成另一个组件。此时可以使用多态来实现,将不同的行为指定给不同的子类,多态是设计系统如何处理相似变化的基本方法,基于多态分配职责的设计可以方便地处理新的变化。在使用多态模式进行设计时,如果需要对父类的行为进行修改,可以通过其子类来实现,不同子类可以提供不同的实现方式,将具体的职责分配给指定的子类。新的子类增加到系统中也不会对其他类有任何影响,多态是面向对象的三大基本特性之一(另外两个分别是封装和继承),通过引入多态,子类对象可以覆盖父类对象的行为,更好地适应变化,使变化点能够“经得起未来验证”。多态模式在多个GoF设计模式中都有所体现,如适配器模式、命令模式、组合模式、观察者模式、策略模式等。


二、使用步骤

示例

public class Folder : FileSystem {
    private List<FileSystem> _childrens = null;
    public Folder(string name) : base(name) {
        _childrens = new List<FileSystem>();
    }
    public override FileSystem Attach(FileSystem component) {
        _childrens.Add(component);
        return this;
    }
    public override FileSystem Detach(FileSystem component) {
        _childrens.Remove(component);
        return this;
    }
    public override void Print(int depth = 0) {
        Console.WriteLine(new string(SPLIT_CHAR_DIR, depth) + _name);
        foreach (var component in _childrens) {
            component.Print(depth + 1);
        }
    }
}

以上代码可在我的 C#设计模式 系列博文中结构型模式下的组合模式中找到。

相关文章
|
设计模式 测试技术 C#
WPF/C#:在WPF中如何实现依赖注入
WPF/C#:在WPF中如何实现依赖注入
341 0
|
12月前
|
安全 Linux 数据安全/隐私保护
Linux强制修改用户密码
【9月更文挑战第21天】在 Linux 系统中,可使用以下方法强制修改用户密码:1. 使用 `passwd` 命令,以 root 身份运行 `passwd username` 修改密码,加 `-f` 选项可跳过复杂度检查;2. 使用 `chpasswd` 命令,通过文本文件批量设置密码;3. 结合 `usermod -e 0 username` 和 `chpasswd` 强制用户下次登录时更改密码。注意操作时需确保安全性与合理性。
1335 4
|
网络协议 中间件 Linux
SOME/IP概述2【SOME/IP的主要中间件功能+SOME/IP报文PDU的封装】
SOME/IP概述2【SOME/IP的主要中间件功能+SOME/IP报文PDU的封装】
827 106
SOME/IP概述2【SOME/IP的主要中间件功能+SOME/IP报文PDU的封装】
|
Ubuntu 关系型数据库 MySQL
expect自动交互脚本:简化你的自动化任务
`expect` 是Linux自动化神器,用于模拟键盘输入与交互式应用自动交互,常用于自动登录服务器、执行命令。安装 `expect`(CentOS: `yum -y install tcl expect`, Ubuntu: `apt-get -y install expect`) 后,编写脚本如SSH登录示例,自动发送密码和命令。通过结合shell命令,`expect` 可实现复杂任务,如获取IP、登录MySQL。支持多服务器管理,根据用户输入选择登录。学习 `expect` 提升自动化效率!
899 0
|
网络安全 安全 Java
Java一分钟之-SSL/TLS:安全套接字层与传输层安全
【6月更文挑战第2天】本文介绍了SSL/TLS协议在保护数据传输中的作用,以及Java中使用JSSE实现SSL/TLS的基础。内容涵盖SSL/TLS工作流程、版本、常见问题及解决办法。通过`SSLSocket`和`SSLServerSocket`示例展示了服务器和客户端的实现,并强调证书管理、配置检查和依赖更新的最佳实践,以确保安全的通信。
1288 4
|
数据库连接
数据库连接的时区问题 The server time zone value is unrecognized
数据库连接的时区问题 The server time zone value is unrecognized
192 0
|
XML SQL JSON
query 与 params:选择正确的参数传递方式
query 与 params:选择正确的参数传递方式
|
JavaScript 关系型数据库 MySQL
在银河麒麟arm架构下离线安装mysql5.7
大家久等了,这个银河麒麟 arm 系统很特殊,必须用官方依赖mysql数据库才可以,这里我也是找的麒麟技术人员要的,大家可以下载离线安装官方mysql5.7依赖包和数据库 下载地址
2199 0
|
应用服务中间件 开发者 AHAS
《学会提问》——逻辑谬误初识
本文通过一些常见的例子讲述逻辑谬误,希望大家在这个信息繁杂的社会上, 对于接收的信息, 都能保持自我的批判性思考, 不要被某些有意为之的言论带偏。
|
存储 数据处理
一篇文章彻底学会画数据流图
一篇文章彻底学会画数据流图
9870 0