设计模式-六大设计原则

news2024/9/24 19:18:03

1、单一职责原则(Single Responsibitity Principle)

         一个类或者模块只负责完成一个职责;

【实例】

        上面这个类,当此类只是用来展示用户信息,则设计符合单一职责;当此用户的地址经常需要使用,比如电商平台类的项目,则需要将地址信息分离出来才符合单一职责。

1.1 如何判断一个类是否违反单一职责

  • 类中代码行数、函数、属性过多
  • 类依赖的其他类过多(如果某个 service 类需要依赖多个不同功能的 service 类来完成一个复杂的业务逻辑,但自身的职责仍然是单一的,那么这也是符合单一职责原则的)
  • 私有方法过多
  • 类中的大量的方法总是操作类中的几个属性(这种时候这几个属性可能构成独立职责)

2、开闭原则(Open Close Principle)

         软件当中的对象、类、模块和函数对扩展应当开放,对于修改应该封闭;

【实例】

        系统A与系统B之间进行数据传输使用的是427版本的协议,一年以后对427版本的协议进行了修正;设计时应该考虑的数据传输协议的可变性,抽象出具有报文解译、编制、校验等所有版本协议使用的通用方法 ;

2.1 如何保证开闭原则的实现

        需要培养顶层设计思维:

  • 抽象意识:要求我们在编写代码时尽量定义抽象(如接口或抽象类),而不是具体的实现;这使得我们能够在需要扩展功能时,通过实现新的具体类而不是修改已有类的方式来实现。
  • 封装意识:要求我们将变化的细节封装起来,通过稳定的接口对外提供服务。这样,当需要更改内部实现时,对外部使用者的影响最小。
  • 扩展意识:设计灵活的体系结构,使系统能够通过添加新代码来实现扩展,而不是修改现有代码。

3、里氏替换原则(Liskov Substitution Principle)

         子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。 

【实例】

        如在一个商城项目中, 定义结算接口Istrategy,该接口有三个具体实现类,分别为 PromotionalStrategy (满减活动,两百以上打八折)、RebateStrategy (打折活动)、 ReduceStrategy(返现活动)

        结算接口与三个实现类:

public interface Istrategy {
    public double realPrice(double consumePrice);
}

public class PromotionalStrategy implements Istrategy {
    public double realPrice(double consumePrice) {
        if (consumePrice > 200) {
            return 200 + (consumePrice - 200) * 0.8;
        } else {
            return consumePrice;
        }
    }
}
public class RebateStrategy implements Istrategy {
    private final double rate;
    public RebateStrategy() {
        this.rate = 0.8;
    }
    public double realPrice(double consumePrice) {
        return consumePrice * this.rate;
    }
}
public class ReduceStrategy implements Istrategy {
    public double realPrice(double consumePrice) {
        if (consumePrice >= 1000) {
            return consumePrice - 200;
        } else {
            return consumePrice;
        }
    }
}

        调用方

public class Context {
    //使用基类定义对象变量
    private Istrategy strategy;
    // 注入当前活动使用的具体对象
    public void setStrategy(Istrategy strategy) {
        this.strategy = strategy;
    }
    // 计算并返回费用
    public double cul(double consumePrice) {
        // 使用具体商品促销策略获得实际消费金额
        double realPrice = this.strategy.realPrice(consumePrice);
        // 格式化保留小数点后1位,即:精确到角
        BigDecimal bd = new BigDecimal(realPrice);
        bd = bd.setScale(1, BigDecimal.ROUND_DOWN);
        return bd.doubleValue();
    }
}

4、接口隔离原则(Interface Segregation Principle)

        客户端不应该被迫依赖于他不使用的方法。                --《代码整洁之道》

        要为各个类建立他们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用;

【实例】

        实现删除用户的功能遵照接口隔离原则,为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。

        将删除接口单独放到另外 一个接口 RestrictedUserService 中, 然后将 RestrictedUserService 只打包提供给后台管理系统来使用。

5、依赖倒置原则(Dependence Inversion Principle)

        高层模块不应该依赖于底层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。

【实例】

        假设需要组装一台电脑,需要cpu、硬盘、内存等,具体的配置有多种品牌的选择;

        这样设计电脑就可以随意搭配不同品牌配置,使得代码更加灵活;

6、迪米特法则(Law Of Demter)

        一个类(模块)对其他的类(模块)有越少的了解越好;

【实例】

        如明星与经纪人、粉丝之间的关系

        明星不需要对粉丝有过多了解,他们之间的互动通过经纪人来运行;

  • 通过中介会避免过于耦合的关系,但是中介多了又会增加复杂性,降低模块之间的通信效率;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

20240803---特征选择与稀疏学习

1.特征选择:在机器学习任务中,通过样本的特征预测样本所对应的值。 (1)无关特征:通过空气的湿度、环境的温度、风力、当地人的男女比例来预测明天是否下雨。男女比例属于无关特征。 (2)冗余特征…

SSM学习11:springboot基础

教学视频 黑马程序员SpringBoot3Vue3全套视频教程,springbootvue企业级全栈开发从基础、实战到面试一套通关 springboot基础 搭建项目 修改配置文件 修改application.yml(后缀名不对,可以改成这个),配置数据库 spr…

基础实验回顾

一、虚拟机网络设定 克隆一台node1 在node1上进行网络配置 进入网卡配置目录 # 红帽9网卡配置文件目录,其他版本不一样 [rootlocalhost ~]# cd /etc/NetworkManager/system-connections/网卡配置文件 [rootlocalhost system-connections]# vim ens160.nmconnect…

@Value获取值和@ConfigurationProperties获取值用法及比较(springboot)

目录 1. 简介1.1 value基本用法 1.2 ConfigurationProperties基本用法 2. 使用2.1 value的使用创建application.yml创建Person.java创建Dog类写一个测试类 2.2 ConfigurationProperties的用法创建Person2.javaDog类写测试类 3. 区别3.1 松散绑定例子 3.2 SpEL主要用途特点例子 …

240803-沉侵式翻译插件配置Ollama的API实现网页及PDF文档的翻译

1. 在插件中点击Options按钮 2. 在开发者模式中启动Enable Beta Testing Features 3 在General中进行设置 ## 4. 在Expand中设置API的URL 5. Qwen:0.5B网页翻译效果 6. Qwen:0.5BPDF翻译效果 7. 参考文献 gemma - 给沉浸式翻译插件配置本地大模型o…

剪画小程序:致敬奥运举重冠军:照片变成动漫风格!

在巴黎奥运会的赛场上,那些奥运冠军们的身影如同璀璨星辰,闪耀着无尽的光芒! 看,举重冠军力拔山兮气盖世,那坚定的眼神中透露出无畏的勇气,爆发的力量更是震撼人心。 借助剪画,将这令人心潮澎湃…

【Vue】computed计算对象不生效问题?

问题描述 最近使用vuex来管理全局状态,遇到了computed计算state中数据却不生效的问题。 原因分析: 先看vue官网示例: computed接收的是一个getter函数,但是这个getter函数是懒加载并且有缓存的,当计算属性最终计算…

ORACLE和PG的饭圈文化

饭圈文化: 就是FANS! 饭圈,网络用语中指粉丝圈子的简称,另外“粉丝”一词的英文单词为“fans”,单词fans本身由fans构成,s一般表示多个,其中的fan可以直接音译为“饭”。 [1]粉丝群体叫“饭”,他们组成的…

特定领域软件架构-系统架构师(三十八)

软件架构复用 有三个阶段: 首先构造/获取可复用的软件资产其次管理这些资产(构件库)最后针对这些需求,从这些资产中选择可复用的部分,满足需求应用系统。 特定领域软件架构 DSSA(Domain Specific softwa…

小程序背景图片无法通过 WXSS 获取

问题:pages/index/index.wxss 中的本地资源图片无法通过 WXSS 获取 可以使用网络图片,或者 base64,或者使用标签。 将图片转换为base64,地址 base64图片在线转换工具 - 站长工具 在这里把要使用的图片转换一把,然后将得…

xss漏洞(三,xss进阶利用)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 1,本文基于dvwa靶场以及PHP study进行操作,靶场具体搭建参考上一篇: xss漏洞(二,xss靶场搭建以及简单…

点可云ERP进销存V8版本—销货订单的操作使用与关联单据处理

本章将要讲解销货订单的详细操作内容,以及导入导出、打印功能,还包括与销货订单相关联的其他单据之间的处理关系。 销货订单是指客户向用户企业提交的购买产品或者服务的请求或者指示,它记录了客户的需求和购买意向,并用于指导和管…

锅总浅析防火墙

防火墙简介 防火墙是一种网络安全设备或软件,用于监控和控制进出网络流量,基于一组预定义的安全规则来决定允许或阻止特定的网络流量。防火墙的主要目的是保护网络和计算机系统免受未经授权的访问、攻击和其他安全威胁。以下是防火墙的几个关键概念和类…

技术前沿:7个未来派网站模板的创新探索

1、即时设计资源广场 即时设计——可实时协作的专业 UI 设计工具https://ad.js.design/online/ui/?sourcecsdn&plan802即时设计是一种原型设计软件,其材料广场非常丰富,涵盖了组件、页面、原型、设计、思维导图、流程图、操作图等方面。因为即时设…

ASPCMS 漏洞详细教程

一.后台修改配置文件拿shell 登录后台 如下操作 保存并抓包 将slideTextStatus的值修改为1%25><%25Eval(Request(chr(65)))25><%25 放包&#xff08;连接密码是a&#xff09; 然后用工具连接 成功连接

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——3bin模型转化环境的准备

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——3bin模型转化环境的准备 ​ 今天给大家带来的是在上一期基础上最重要的一步&#xff0c;这个地方是我开始踩坑的开始。 ​ 当时一开始看教程&#xff0c;不知道怎么看到了高级进阶版。当时也是弄了好久…

声临其境!体验阿里云开源音频基座大模型——FunAudioLLM

千等万等&#xff0c;终于还是等来了阿里最新开源的音频基座大模型FunAudioLLM&#xff0c;真不愧是AI届的活菩萨啊&#xff0c;不过&#xff0c;我心心念念的达摩院寻光AI视频创作平台到底什么时候开放啊&#xff01;&#xff01; 停止发疯&#xff0c;进入正题。。。 引言 …

【C语言】关系、条件、逻辑操作符

1. 关系操作符 在C语言中用于比较的表达式称为关系表达式&#xff0c;而其中使用的运算符就称为关系运算符&#xff0c;主要有&#xff1a; >大于运算符<小于运算符>大于等于运算符<小于等于运算符相等运算符!不相等运算符 比如&#xff1a; a < b; a > …

安卓将子模块打aar包,并将其远程依赖打包进去

生成 AAR 包 在Android Studio Terminal 窗口输入以下命令&#xff1a; ./gradlew :monitor:assembleRelease把 monitor 换成你子模块的名称&#xff0c;不出意外的话 就会在下面目录生成相应aar文件 注意&#xff1a;如果你的Java运行环境是Java 8 则在老一点的AS上 可以运…

【Stable Diffusion】(基础篇九)—— 扩展

扩展 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 添加一些SD对应的扩展&am…