程序设计六大原则之开放封闭原则

AIDL HAL服务从零到一:构建现代Android硬件抽象层 本文详细介绍了从零开始构建现代Android AIDL HAL服务的完整流程。通过定义接口、实现服务逻辑、配置构建与VINTF清单,并最终集成到系统镜像,开发者可以掌握利用AIDL替代传统HIDL来开发硬件抽象层的核心方法。文章重点解析了AIDL HAL的创建流程,并对比了其与HIDL在语法、工具链和集成方式上的优势,帮助开发者高效构建稳定的硬件接口。 阅读详情

一.开饭封闭原则(Open-Closed Principle,OCP)

1.定义:

软件实体(包括类、模块、函数)应该为扩展而打开,为修改而关闭。

大概意思就是:一个软件实体应该通过扩展来实现变化,而不是通过修改原有的代码来实现变化

2.实现:

开闭原则实现关键是抽象

抽象基类:把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征。作为系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需修改

派生类:从抽象基类派生一个或多个新的具体实现,可以扩展基类的行为,系统设计对扩展开放

3.使用:

通过接口或者抽象类约束扩展,对于扩展进行边界限定

参数类型、引用对象尽量使用接口或者抽象方法,而不是实现类

抽象层应该保持稳定和可靠,一但确认即不允许修改

4.优点:

可复用、可维护

5.抽象方法示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OCP.Study.Abstract
{
    /// <summary>
    /// 抽象类
    /// 形状
    /// </summary>
    public abstract class Shape
    {
        protected string Name;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="name">形状名称</param>
        public Shape(string name)
        {
            this.Name = name;
        }
        /// <summary>
        /// 面积
        /// </summary>
        /// <returns></returns>
        public abstract double Area();
        /// <summary>
        /// 显示
        /// </summary>
        public abstract void Display();
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OCP.Study.Abstract
{
    /// <summary>
    /// 圆形
    /// </summary>
    public class Circular:Shape
    {
        private double Radius;      

        public Circular(string name,double radius) : base(name)
        {
            this.Radius = radius;
        }

        public override double Area()
        {
            return Math.Round(Math.PI*Radius*Radius,2);
        }

        public override void Display()
        {
            Console.WriteLine($"{Name}的面积是{this.Area()}");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OCP.Study.Abstract
{
    /// <summary>
    /// 矩形
    /// </summary>
    public class Rectangle : Shape
    {
        private double Width;//宽度
        private double Length;//长度

        public Rectangle(string name, double width, double length) : base(name)
        {
            this.Width = width;
            this.Length = length;
        }
       
        public override double Area()
        {
            return Length * Width;
        }

        public override void Display()
        {
            Console.WriteLine($"{Name}的面积是{this.Area()}");
        }
    }
}
using OCP.Study.Abstract;
using OCP.Study.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OCP.Study
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                {
                    Shape Circular = new Circular("圆形", 2);
                    Circular.Area();
                    Circular.Display();
                }
                {
                    Shape Rectangle = new Rectangle("矩形", 7, 12);
                    Rectangle.Area();
                    Rectangle.Display();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
        }
    }
}

6.接口示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OCP.Study.Interface
{
    /// <summary>
    /// 课程接口
    /// </summary>
    public interface ICourse
    {
        /// <summary>
        /// 获取课程ID
        /// </summary>
        /// <returns></returns>
        int GetId();
        /// <summary>
        /// 获取课程名称
        /// </summary>
        /// <returns></returns>
        string GetName();
        /// <summary>
        /// 获取课程价格
        /// </summary>
        /// <returns></returns>
        double GetPrice();
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OCP.Study.Interface
{
    /// <summary>
    /// 课程C#
    /// </summary>
    public class CSharpCourse : ICourse
    {
        private int Id;
        private string Name;
        private double Price;

        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="id">编号</param>
        /// <param name="name">名称</param>
        /// <param name="price">价格</param>
        public CSharpCourse(int id,string name,double price)
        {
            this.Id = id;
            this.Name = name;
            this.Price = price;
        }

        public int GetId()
        {
            Console.WriteLine(this.Id);
            return this.Id;
        }

        public string GetName()
        {
            Console.WriteLine(this.Name);
            return this.Name;
        }

        public double GetPrice()
        {
            Console.WriteLine(this.Price);
            return this.Price;
        }      
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OCP.Study.Interface
{
    public class CSharpCourseDisCount : CSharpCourse
    {
        private double DisCount;

        public CSharpCourseDisCount(int id, string name, double price) : base(id, name, price)
        {
            this.DisCount = price*0.8;
        }

        public double GetDisCount()
        {
            Console.WriteLine(this.DisCount);
            return DisCount;
        }
    }
}
using OCP.Study.Abstract;
using OCP.Study.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OCP.Study
{
    /// <summary>
    /// 需求在原有的基础上添加折扣方法
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ICourse CSharp = new CSharpCourseDisCount(1,"C#",0.9);
                CSharpCourseDisCount CSharpCourse = (CSharpCourseDisCount)CSharp;
                CSharpCourse.GetId();
                CSharpCourse.GetName();
                CSharpCourse.GetPrice();
                CSharpCourse.GetDisCount();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
        }
    }
}

7.简单说一下抽象类和接口的区别

抽象类:

不能实例化

可以包含抽象方法和抽象访问器(一但包含了抽象方法就必须声明成抽象类)

不能用sealed修饰符(阻止其他类继承自该类)修饰抽象类,因为两个修饰符的含义相反,sealed 修饰符阻止类被继承,而 abstract 修饰符要求类被继承

从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现

接口:

不能被实例化

只能包含方法声明

接口的成员包括方法、属性、索引器、事件(不能包含常量、字段、静态成员、构造函数、析构函数)

相同点:

都不能被实例化

都可以被继承

都可以包含方法声明

派生类必须实现为实现的方法

区别:

抽象类中可以包含静态方法、构造方法、普通成员变量,而接口没有

一个类可以继承多个接口、但只能继承一个抽象类

接口可以被多重实现、抽象类只能被单一继承

如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法

8.属性和字段的区别

属性是对字段的封装,在字段上添加了get、set两个方法

属性从实质上就是一种方法,而字段是用来存数据的

 

 

对CryptoDriver里密钥格式定义的探索(1) 一入网络安全才发现深似海,传统汽车MCU码农转型之路异常艰难。在CP AUTOSAR中的CryptoDriver SWS对密钥格式的需求来源于RFC,其中要求了RSA、ECC、SHE等key material的格式。再往下看,我就有些迷糊了,例如关于RSA Private Key的OCTEE STRING格式根据IETF RFC8017,Public Key又得根据RFC5280,完全不得其解。所以今天先从生成密钥对,并对其进行解析开始,一步一步拆解。 阅读详情

相关推荐

VS2022如何兼容老项目?.NET Framework 4.0/4.5安装避坑指南

本文提供了在Visual Studio 2022中兼容和维护.NET Framework 4.0/4.5等老旧项目的完整解决方案。针对VS2022无法直接识别旧框架的核心问题,文章详细剖析了原因,并重点推荐通过官方NuGet包安全获取引用程序集的方法,给出了从下载、解压到部署至标准目录的详细步骤。同时,文章还深入探讨了项目文件格式过旧、NuGet包还原失败等进阶问题的排查与解决策略,旨在帮助开发者高效、稳定地在现代开发环境中维护历史代码库。

weixin_27734811的博客 513

开放-封闭原则(The Open-Closed Principle)

开放-封闭原则(The Open-Closed Principle)

一朝风月 2644

矩阵管理:一人100账号霸屏小红书,保姆级教程经验技巧

同时,如果你的账号表现很正常,很OK,它也增加账号权重。手机环境:一机一卡一号是基本操作,如果你觉得设备成本高,你就要知道WIN的云真机,一键新机,一键随机设备参数,一键还原,一键安装应用,自带批量发布笔记,私信聚合,自带回复私信,一键养号等等,一人批量注册100个小红书账号真的很简单!从流量逻辑来分析,大家有没有发现,从账号粉丝数来看,小红书很难出现类似抖音上超千万粉丝量级的账号,几十万粉丝的博主已经是头部账号了,原因在于,抖音的流量分发机制是80%的流量集中在 20% 的头部账号而。

FDF432DF的博客 5141

设计原则之一:开放封闭原则

设计原则之一:开放封闭原则

zhouguizhi 6229

手持式激光测距仪全套方案

激光测距全套方案,包括原理图、源代码、PCB、BOM、光学部分资料,结构、特殊元件数据手册及供应商联系方式,提供调试技术文档。全套方案已成功打板验证,实现0.05~50m测量范围,精度在+/—1.5mm,激光波长635~650nm,功率《1mW。方案预留了TTL串口、RS485接口,可通过串口助手看到测量数据,可自行DIY或者商业开发。无论是电路小白,还是技术大拿,都能通过方案资料成功做出一套激光测距仪。

Laser01的博客 2055

医学图像分割实战:基于TransUNet训练自己的眼底硬渗出物数据集(附完整代码)

本文详细介绍了基于TransUNet的眼底硬渗出物分割实战指南,涵盖数据预处理、模型调优、训练策略及性能优化等关键环节。通过代码复现和实验对比,展示了TransUNet在医学图像分割中的优势,为糖尿病视网膜病变的早期诊断提供技术支持。

weixin_42524708的博客 361

开放封闭原则(Open Closed Principle)

在面向对象的设计中有很多流行的思想,比如说 “所有的成员变量都应该设置为私有(Private)”,“要避免使用全局变量(Global Variables)”,“使用运行时类型识别(RTTI:Run Time Type Identification,例如 dynamic_cast)是危险的” 等等。那么,这些思想的源泉是什么?为什么它们要这样定义?这些思想总是正确的吗?本篇文章将介绍这些思想的基础:开放封闭原则(Open Closed Principle)。 Ivar Jacobson 曾说过 “所有系统在其

u010001360的博客 1420

把核心变干净的代价与回报:为什么推动 Clean Core,几乎绕不开 SAP Integration Suite 与 API Management

Clean Core的核心价值在于构建可持续升级的ERP系统架构,其关键不在于减少代码或限制扩展,而是通过解耦和治理实现系统边界的清晰划分。这一理念将推动企业从传统的"私搭乱建"式集成向平台化工程转型,而SAP Integration Suite和API Management正是实现这一转型的核心组件。 Integration Suite作为集成中枢,通过统一平台、可复用内容库和事件驱动架构,将碎片化连接转变为标准化能力;API Management则负责建立接口治理体系,通过统一入口、

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 241

一文搞懂开放封闭原则

软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。这意味着当需求发生变化时,我们应该能够在不修改原有代码的基础上,通过新增代码的方式来满足新的需求。

qq_39406460的博客 1169

零停机更新黑科技:Spring Boot应用实现无缝升级的实战指南

本文介绍了基于Spring Boot和Tomcat实现零停机更新的技术方案,通过动态端口切换和优雅关闭机制,确保服务更新过程中业务不中断。文章详细解析了核心原理,包括内嵌Tomcat的工作机制、零停机更新的三大技术基石(端口动态切换、优雅关闭和进程接管)。同时提供了完整的Java实现代码,重点展示了端口动态检查、参数动态调整、旧进程优雅终止等关键逻辑。该方案适用于高可用系统升级场景,能够有效避免传统部署方式导致的服务中断问题,实现100%无感知的应用更新。

墨夶的博客 818

关闭搜狗输入法右下角广告的解决方案

本文主要介绍了关闭搜狗输入法右下角广告的解决方案,希望能对使用搜狗输入法的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

面向对象设计原则(二):开放-封闭原则(OCP)

开放-封闭原则(Open-closed principle,OCP)也称开闭原则,是面向对象设计(OOD)中比较重要的一种,下面来总结开放-封闭原则的知识点,包括:1、什么是开放-封闭原则?2、为什么需要遵守开放-封闭原则?3、怎么做到开放-封闭原则?4、开放-封闭原则需要注意什么?

tjiyu的博客 4930

【openwrt-21.02】T750 openwrt 双系统说明及切换方法

高度集成的 T750 平台大幅减少组件数量,为产品设计者提供更小的尺寸和更低的功耗。T750 采用先进的 7nm 制程,高度集成 5G 调制解调器和四核 Arm CPU,提供较强的功能和配置,设备制造商得以打造精巧的高性能 CPE 产品,如固定无线接入(FWA)路由器和移动热点。3. preloader 加载并启动 A 系统,若 A 系统的任一启动阶段加载失败,preloader 将重新加载并启动 A 系统 3 次,若 3 次均失败,则自动切换至 B 系统,加载并启动 B 系统。A/B 系统切换流程如下。

wgl307293845的博客 1412

六大设计原则

一个类只允许有一个职责或者功能。

qq_74177011的博客 438

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

面向对象程序设计六大原则

面向对象程序设计原则面向对象程序设计原则一、单一职责原则:全称:“Single-Responsibility Principle” 说明:就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因。所谓职责,我们可以理解他为功能,就是设计的这个类功能应该只有一个,而不是两个或更多。也可以理解为引用变化的原因,当你发现有两个变化会要求我们修改这个类,那么你就要考虑撤分这个类了。因为职责是变化的一个

Purse的博客 1505

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

面向对象的原则

程序设计原则 单一职责原则(SRP) 就一个类而言,应该仅有一个引起它变化的原因。 开放封闭原则 软件实体(类、模块、函数等)应该可以扩展,但是不可修改。也就是对于扩展是开放等,对于更改是封闭等。 面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。 无论模块多么“封闭”,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对他设计对模块应该对哪种变化封闭做出选择。必须...

qq_24367757的博客 262

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

设计模式六原则

单一职责原则(SRP): 就一个类而言,应该仅有一个引起它变化的原因。也就是说一个类完成一个职责。 职责:业务逻辑,以某种行为来执行。 如果混在一起写的时候,修改其中的一个职责有可能会引起其他职责的错误。当另一个类只使用其中一个职责时,另一个职责会占用不必要的资源。 源代码尽量不要改动。 开放封闭原则: 对扩展开放,对修改关闭。 接口不要改。 扩展:继承和多态实现,增加代码。 里...

hujinlong6930的博客 116

大话设计模式之设计原则

    在总结设计模式之前,我觉得有必要把程序设计中要遵循的几个设计原则总结一下,因为在后面总结设计模式的时候,你会发现,基本上设计模式都是设计原则的体现和应用而已,有助于我们后期的总结学习。单一职责原则    单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱...

xiaomin的博客 221

设计模式-六大原则

当初作为小白,提到设计模式,就会觉得很高大上,很牛叉。其实,在我们身边,在我们的项目中,设计模式的身影无处不在。然而,什么是设计模式呢?百度解释为:设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 经验总是值得学习的,特别是对我们编程有极大帮助的设计模式经验。在Java中常见的设计模式有23种,而这23种设计模式都遵循了设计模式的六大原则,这......

笔沫拾光 702

程序设计六大原则-概况与举例

总结设计原则其实很早以前就在想了,但是起初我认为固定的原则会局限人的创新思维,陈旧的定律不一定是最好的。实际上随着代码量的沉积,你会发现无形之中你的程序设计会和这六大原则不谋而合。大道至简,前人走过的路,可能也是你将要走的路。 原则一:单一职责 这一块不管你写前端还是后端的项目,你会明白,所谓的设计模式(如MVC,MCP)就是帮助你实现部分代码的单一职责,就像是流水线上工作流程拆分,很多简单的步骤实现庞大的逻辑。当职责变得单一时,复用性提高,个体业务逻辑难度降低。这个原则算是应用最广,也最显而易见的。

赵星海 2061

1.面向对象三大特性六大原则

JAVA是一门面向对象的语言,那么其面向对象主要有以下几个特性和原则:面向对象三大特性六大原则面向对象的三大特性是"封装、"多态"、"继承",五大原则是"单一职责原则"、"开放封闭原则"、"里氏替换原则"、"依赖倒置原则"、"接口分离原则"、"迪米特原则(高内聚低耦合)"。 什么是面向对象面向对象(Object Oriented,OO)是软

郑学炜的技术博客 6330

设计模式之六大原则

设计模式的六大原则单一职责原则开放封闭原则依赖倒转原则里氏替换原则迪米特法则(也叫最少知识原则)合成/聚合复用原则 最近在学设计模式,才理解真正的面向对象编程,明白面向对象编程对软件开发的重要性。 以下是有关于设计模式的一点笔记。 面向对象编程的三大特性:封装、继承、多态。 一个好的软件应该具备以下特点:代码易于维护、易扩展、易复用,类与类之间关系应强内聚、松耦合。 设计模式使得程序更加灵活,容易...

qq_34606839的博客 368

程序设计六个原则

程序设计6大设计原则和23种设计模式,其中6大设计原则如下: 1、单一职责原则 不同的类具备不同的职责,各司其职。做系统设计时,如果发现有一个类拥有了两种职责,那么需要考虑可以将这个类分成两个类吗?如果真的有必要,那就分开,千万不要让一个类干的事情太多。 ps:一个类只承担一个职责,逻辑解耦,是程序逻辑清晰; 2、开放封闭原则(开闭原则) 类、模块、函数,可以去扩展,但不要去修改。如果要修改代码,...

sxw3100212034的博客 1371

设计模式六大原则_设计模式—设计六大原则

1. 单一职责原则(SRP) 定义:就一个类而言,应该仅有一个引起它变化的原因。 从这句定义我们很难理解它的含义,通俗讲就是我们不要让一个类承担过多的职责。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到破坏。 比如我经常看到一些Android开发在Activity中写Bean...

weixin_39774491的博客 149

快速理解-设计模式六大原则

前言:设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。只有精通了设计模式,才敢说真正理解了软件工程。可以说,设计模式是每一个架构师所必备的技能之一。想要精通设计模式,必须要先搞清楚设计模...

AlbenXie的博客 613

设计(模式)六大原则

一: 单一职责原则(Single Responsibility Principle) 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 遵循单一职责原的优点有: 可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多; 提高类的可读性,提高系统的可维护性; 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对...

qq_38311489的博客 204
上一篇: SQLServer系统函数之聚合函数
下一篇: .NET应用程序和工具
Code技术分享
博客等级 码龄7年 3327粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值