首页 > 其他分享 >设计原则

设计原则

时间:2023-08-29 16:44:39浏览次数:31  
标签:原则 子类 接口 设计 父类 方法 public

一、单一职责原则(SRP)
二、开闭原则(OCP)对扩展开放,对修改关闭三、里氏替换原则(LSP)父类的属性和方法必须完全可以被继承不会出现父类方法被子类使用出现不符合的情况四、依赖倒置原则(DIP)通过 抽象接口 来定义模块之间的依赖关系五、接口隔离原则(ISP)  拆接口,避免继承类 重复实现 接口内容。

三大基本面向对象设计原则

-针对接口编程,而不是针对实现编程

-优先使用对象组合,而不是类继承

-封装变化点

一.单一职责原则(SRP)

1、定义

一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。理解:单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则
每个类只负责单一的功能,该类尽量将一个功能做到极致。
避免在一个多次修改一个类,多次用if,转继承。

二、开闭原则(OCP)

1、定义

一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。软件实体:软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类理解:抽象化是开闭原则的关键
开闭原则就是一个目标,其它五大原则都是实现手段,它就像一个口号,你们都要奔着这个口号来多次用if,转继承。

三、里氏替换原则

1、定义:

子类可以扩展父类的功能,但不能改变父类原有的功能派生类(子类)对象可以在程序中代替其基类(超类)对象。程序中的对象不管出现在什么地方,都应该可以使用其派生类(子类)的对象进行替换,而不影响程序运行的正确性。子类一般不要覆写父类的方法,尽量直接使用父类的方法即可。(避免父类的方法返回true,而子类覆写的方法返回false)
理解:
  1. 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
  2. 子类中可以增加自己特有的方法。
  3. 当子类的方法重载父类的方法时,方法的前置条件(方法的输入,入参)要比父类的入参更宽松。
  4. 当子类的方法实现父类的方法时(重写,重载,实现抽象方法),方法的后置条件(输出、返回值)要比父类更严格或相等。
自己理解:父类的属性和方法必须完全可以被继承不会出现父类方法被子类使用出现不符合的情况

2、为啥有?

里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,它反映了基类与子类之间的关系,是对开闭原则的补充。

3、优点(继承的优点??)

  1. 约束继承泛滥,它也是开闭原则的一种很好的体现。
  2. 提高了代码的重用性。
  3. 降低了系统的出错率。类的扩展不会给原类造成影响,降低了代码出错的范围和系统出错的概率。
  4. 加强程序的健壮性,同时变更时可以做到非常好的兼容性,提高程序的维护性、可扩展性,降低需求变更时引入的风险。

四、依赖倒置原则(DIP)

1、定义

a.高层模块不应该依赖低层模块,二者都应该依赖其抽象;b.抽象不应该依赖细节;细节应该依赖抽象。

2、为什么需要遵守依赖倒置原则

     高层:客户端、服务消费者、方法调用者……(可能变动、依赖性高)

     低层:服务端、服务提供者、方法实现者,细节实现者……(易变动、通常需要扩展)

     抽象:交互行为、策略、契约、流程、业务模型……(稳定、可重用)



     传统系统:高层模块依赖低层模块。

     DIP第一层境界:低层模块依赖高层模块。

     DIP第二层境界:无论高层模块或低层模块实现的细节,都依赖于独立出来的抽象层。

3、在面向对象设计中如何实现依赖倒置原则

1、基础:依赖于抽象

    即:程序中所有的依赖关系都应该终止于抽象类或者接口中;而不应该依赖于具体类。

编程时可以这样做:(1)、类中的所有成员变量必须是接口或抽象,不应该持有一个指向具体类的引用或指针。      即所有具体类只能通过接口或抽象类连接。      不应该:HashMap map;      应该:Map map;(2)、任何类都不应该从具体类派生。(3)、任何方法都不应该覆写它的任何基类中已经实现的方法。(里氏替换原则)(4)、任何变量实例化都需要实现创建模式(如:工厂方法/模式),或使用依赖注入框架(如:Spring IOC)。

注:

     有些书籍和文章把DIP等同于面向接口编程;

     个人理解是面向接口编程只是DIP的基础,而核心是"依赖倒置"。

4、依赖倒置原则的实例应用

4-1、案例
4-2、在系统架构中的应用:
 1、数据存储     传统:     业务层在不同数据类型的CURD地方,直接调用不同数据系统(Mysql/Mongo/Rides缓存/本地文件系统)的相关接口,把数据保存到相应系统。     DIP:     抽象数据存储层(DAO),DAO模块实现不同数据系统的接口;     业务层调用DAO层接口传入不同类型数据,DAO层适配到相应数据系统。  2、消息传输     通常:     上层通过调用下层接口,发消息给下层。     一般情况上层需要同步等待下层处理后的响应。     DIP:     通过消息队列(Message Queue)解耦,实现异步传输;     上层调用MQ的发送消息接口,消息发送到MQ,下层调用MQ获取消息的接口进行消费;     这时上/下层都可以轻松进行扩展。     注意:如果上层实时关注下层的处理结果,MQ就不适用。

五、接口隔离原则(ISP)

1、定义

a.客户端只依赖于它所需要的接口;它需要什么接口就提供什么接口,把不需要的接口剔除掉。
b.类间的依赖关系应建立在最小的接口上。
在这里插入图片描述
隔离三个接口,避免子类重复实现

2、实例应用

    internal interface IQueryScore
    {
        // 查询成绩
        public void queryScore();

        // 打印成绩单
        public void printScore();
    }
    internal interface IOperateScore
    {
        // 修改成绩
        public void updateScore();

        // 添加成绩
        public void saveScore();

        // 删除成绩
        public void delete();

        // 计算总分
        public double sum();

        // 计算平均分
        public double avg();
    }
    internal class StudentOperate : IQueryScore
    {
        public void printScore()
        {
            // 查询成绩
            throw new NotImplementedException();
        }

        public void queryScore()
        {
            //打印成绩单
            throw new NotImplementedException();
        }
    }
    internal class TeacherOperate : IQueryScore, IOperateScore
    {
        public double avg()
        {
            throw new NotImplementedException();
        }

      //....
    }

3、自己理解:

拆接口,避免接口继承类重复实现。
(26条消息) C#设计模式六大原则 - 开闭原则_c# 开闭原则_familychase的博客-CSDN博客
https://blog.csdn.net/qq_34482621/article/details/103616713






标签:原则,子类,接口,设计,父类,方法,public
From: https://www.cnblogs.com/buzheng11/p/17665246.html

相关文章

  • 跨境盒子:跨境电商必备,推荐5款便宜好用的Logo设计网站!
    Logo设计网站可以让企业轻松建立强大的品牌影响力,今天给大家推荐5款如今较为好用的设计网站,让设计工作轻松高效!一、Canva可画:小型企业总体最佳logo设计网站Canva是小型企业(或任何规模的企业)Logo设计的最佳网站。任何人都可以在Canva一个免费、用户友好的设计平台上为任何类型的企......
  • 【23种设计模式】创建者模式(四)
    前言在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”......
  • Spring Cloud与Docker高并发微服务架构设计实施---微服务监控中心
    在众多正在运行的微服务中,我们必须做到随时掌握每一个服务的运行情况及其健康状态,才能保证整个平台的稳定性和可靠性。使用Hystrix断路器仪表盘功能就可以创建一个监控中心,实现在线监控微服务的运行状态。(此处代码有待完善)首先,在项目的配置管理中心中增加依赖配置<dependencies......
  • 关于DDD中聚合设计的思考(以博客园为例)
    前言聚合作为领域模型中重要的业务功能单元,它的设计是领域建模过程中非常重要的工作。其中聚合根的判断并非一件易事,往往给人一种似是而非的感觉,让人难以捉摸,陷入两难的境地。今天笔者就想以博客园为例来探讨下:博客(Blog)和评论(Comment)究竟是不是一个聚合?问题探讨众所周......
  • 个人相册管理系统-计算机毕业设计源码+LW文档
    随着社会的发展,人们生活水平的 提高,网络科技和云端技术的完善,越来越多的人喜欢通过拍照的方式把生活中美好的事物以及一瞬间记录下来,但是随着照片越来越多,传统的相册已经不能满足我们的基本需求,不方便携带,也不方便与他人分享。这个时候,网络个人相册就能解决这些问题,不光能保存大量......
  • 教务管理系统-计算机毕业设计源码+LW文档
    摘 要随着社会经济的发展和进步的速度,当时的人们从某种角度看到,对信息技术的认识已经从低层次发展到高层次,进一步提升到理性思考的意识,对信息化管理工作的需要逐渐增加。当代科学的信息管理使相关信息的存储更加准确、快捷、完善,能够进一步提升工作中信息管理的效率,促进其发展。......
  • 出租车管理系统-计算机毕业设计源码+LW文档
    摘 要随着城市交通建设的快速发展,出租车行业也随之迅速发展,城市出租车车队的规模和数量都在增长,这为出租车管理公司制定了新的、更严格的标准。企业也迫切希望企业规范管理实践,使其发展经营更加科学,就必须学习尖端管理技术,并鼓励企业管理战略的发展。随着计算机技术和通信技术......
  • 常见的并发网络服务程序设计方案
    文章目录一、最基本的并发网络服务:IO复用1、select模型2、poll模型3、epoll模型二、单线程Reactor三、Reactor+ThreadPool四、MultipleReactors(oneloopperthread)一、最基本的并发网络服务:IO复用目前常用的IO复用模型有三种:select,poll,epoll。1、select模型说的通俗一点就是......
  • 应用层缓冲区的设计
    文章目录一、TCP分包问题1、长连接和短连接2、长连接和短连接的分包方法3、长连接和短连接的应用场景二、TCP粘包问题三、Buffer类的设计与使用1、为什么需要应用层buffer?2、如何设计并使用应用层Buffer?3、Buffer类的设计一、TCP分包问题在TCP这种字节流协议上做应用层分包是网络......
  • 【muduo】常见的并发网络服务程序设计方案
    文章目录一、IO复用1、select模型2、poll模型3、epoll模型二、单线程Reactor三、Reactor+ThreadPool四、MultipleReactors(oneloopperthread)一、IO复用目前常用的IO复用模型有三种:select,poll,epoll。1、select模型说的通俗一点就是各个客户端连接的文件描述符也就是套接字,都......