厚积薄发打卡Day114:Debug设计模式:设计原则(二)<接口隔离原则、迪米特法则>

news2024/10/7 20:36:47

厚积薄发打卡Day114:Debug设计模式:设计原则(二)<接口隔离原则、迪米特法则>

接口隔离原则

定义

用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口

一个类对一个类的依赖应该建立在最小的接口上,建立单一接口,不要建立庞大臃肿的接口

细粒度组装 粗粒度不可拆分

尽量细化接口,接口中的方法尽量少

注意适度原则,一定要适度

优点:符合我们常说的高内聚低耦合的设计思想,从而使得类具有很好的可读性、可扩展性和可维护性。

场景coding

  • 动物行为接口类:以兔子🐇和小鸟🐦为例:

    /**
     * Created by Wayne
     * 动物行为
     */
    public interface IAnimalAction {
        void eat(); // 吃
    
        void fly(); // 飞
    
        void swim(); // 游泳
    
    }
    
    public class Bird implements IAnimalAction {
        @Override
        public void eat() {
    
        }
    
        @Override
        public void fly() {
    
        }
    
        @Override
        public void swim() {
            // TODO: 有些鸟不会游泳
        }
    }
    
    public class Rabbit implements IAnimalAction{
        @Override
        public void eat() {
    
        }
    
        @Override
        public void fly() {
            // todo 兔子不会飞
        }
    
        @Override
        public void swim() {
            // TODO 兔子也不会游泳
        }
    }
    

在这里插入图片描述

由于动物行为具有多样性,用统一的接口约束不合理,设计过程中违背了接口隔离原则,造成代码冗余等情况。

  • 优化:具体行为动物接口实现

    如定义分别定义:吃、飞、睡 三个标准接口

    /**
     * Created by Wayne
     */
    public interface ISwimAnimalAction {
        void swim();
    }
    
    /**
     * Created by Wayne
     */
    public interface IEatAnimalAction {
        void eat();
    }
    /**
     * Created by Wayne
     */
    public interface IFlyAnimalAction {
        void fly();
    }
    

    这时候创建类时就可以根据对应的特性去实现:

    public class Dog implements ISwimAnimalAction, IEatAnimalAction {
    
        @Override
        public void eat() {
    
        }
    
        @Override
        public void swim() {
    
        }
    }
    
    public class Chicken implements IEatAnimalAction{
        @Override
        public void eat() {
            
        }
    }
    
    public class Pigeon implements IFlyAnimalAction,IEatAnimalAction{
        @Override
        public void eat() {
            
        }
    
        @Override
        public void fly() {
    
        }
    }
    

在这里插入图片描述

通过自定义接口最小粒度实现。

接口隔离原则与单一职责原则区别**(3大区别):**

接口隔离原则与单一职责原则区别(3大区别) – mikechen的互联网架构

简单总结:单一职责重点在实现,接口隔离重点在接口

  1. 单一职责原则注重的是类、接口和方法的职责(注重实现),而接口隔离原则注重的是对接口依赖的隔离;
  2. 单一职责原则针对的是模块、类的设计,注重的是职责,这是业务逻辑上的划分;
  3. 接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。

尽量用少的接口 完成尽量多的功能

在这里插入图片描述

迪米特法则

定义

一个对象应该对其他对象保持最少的了解。又叫最少知道原则。尽量降低类与类之间的耦合

优点:降低类之间的耦合

强调只和明友交流,不和陌生人说话。

  • 什么是朋友
    • 出现在成员变量、方法的输入、输出参数中的类称为成员明友类,而出现在方法体内部的类不属于朋友类。

场景coding

老板BOSS让经理Manger去核对数据Data

  • 直接操作:BOSS下令让Manger去查Data

    public class Boss{
        public void  commandCheckDataNumber(Manger manger){
            List<Data> dataList = new ArrayList<Data>();
            // 模拟数据统计操作
            for (int i = 0; i < 20; i++) {
                dataList.add(new Data());
            }
            manger.checkDataNumber(dataList);
        }
    }
    
    public class Manger {
        public void checkDataNumber(List<Data> dataList) {
            System.out.println("现存数据数量是:" + dataList.size());
        }
    }
    
    public class Data {
    }
    
    public class Test {
        public static void main(String[] args) {
            Boss boss = new Boss();
            Manger manger = new Manger();
            boss.commandCheckDataNumber(manger);
        }
    }
    

    在这里插入图片描述

    在这里DATA和Manger&Boss都有交互,一定程度上的耦合不符合迪米特法则。

  • 迪米特优化:这里BOSS和Manger是朋友,Manger和Data是朋友,而Boss跟Data没有直接关系。

在这里插入图片描述

public class Boss{
    public void  commandCheckDataNumber(Manger manger){
        manger.checkDataNumber();
    }
}
public class Manger {
    public void checkDataNumber() {
        List<Data> dataList = new ArrayList<Data>();
        // 模拟数据统计操作
        for (int i = 0; i < 20; i++) {
            dataList.add(new Data());
        }
        System.out.println("现存数据数量是:" + dataList.size());
    }
}

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

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

相关文章

如何将 Spring Boot 项目提交到 Gitee 进行远程管理?

如何将初始化完成的 Spring Boot 项目&#xff0c;提交的 Gitee 仓库&#xff0c;进行远程管理&#xff1f; 目录 如何将初始化完成的Spring Boot项目&#xff0c;提交的Gitee仓库&#xff0c;进行远程管理&#xff1f; 0. 环境说明 1.创建并初始化Spring Boot项目 2.创建…

如何设计一个 70w 在线人数的弹幕系统 ?

背景 现在的抖音、快手等一系列能支持直播的软件如何做到的同一时间万人发弹幕的功能的&#xff1f; 问题分析 带宽压力&#xff1b; 弱网导致的弹幕卡顿、丢失&#xff1b; 性能与可靠性。 带宽优化 启用Http压缩 HTTP压缩是指在Web服务器和浏览器间传输压缩文本内容的方…

网络— — 二层交换机

网络— — 二层交换机 1 交换机端口 g0/3 g&#xff1a;1000M/s0&#xff1a;模块号3&#xff1a;接口号 每个端口网速&#xff1a; Ethernet 10M/s FastEthernet 100M/s GigabitEthernet 1000M/s TenGigabitEthernet 10000Mb/s 2 数据链路层&#xff08;2层&#xff09; Data…

python图像处理(opencv入门)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面我们讨论了fpga的基本操作,这些都是作为整个图像处理的基础部分进行学习的,本质上还是希望用fpga来对部分算法进行加速处理。当然,fpga实现的只是一部分算法,并不是所有的算…

【手写 Promise 源码】第二篇 - Promise 功能介绍与特性分析

一&#xff0c;前言 上一篇&#xff0c;对 Promise 进行了简单介绍&#xff0c;主要涉及以下几个点&#xff1a; Promise 简介和基本使用&#xff1b;Promise 和 callback 对比&#xff1b;Promise 的重要性和作用&#xff1b;Promise 使用场景&#xff1a;Promisify 封装&am…

Python Flask 框架设置响应头,一篇文章学明白

flask 响应头设置&#x1f4d6; 导读&#x1f4d6; Python Flask 设置响应头&#x1f389; response.headers 属性&#x1f389; flask.abort() 函数返回特定状态码&#x1f4d6; Flask 中可设置的响应头参数&#x1f4d6; 其他关于响应头的配置&#x1f381; 使用中间件&#…

[Python]调用pytdx的代码示例

安装pytdxpip install pytdx简单示范from pytdx.hq import TdxHq_API api TdxHq_API() # 数据获取接口一般返回list结构&#xff0c; with api.connect(119.147.212.81, 7709): # 返回普通listdata api.get_security_bars(9, 0, 000001, 0, 10) print(data)输出结果[Ordered…

康巴丝(compas)某Wi-Fi万年历无法自动校时的问题

笔者前两年购买过一块康巴丝牌的电子万年历&#xff0c;该万年历的最大特点可以通过Wi-Fi联网自动校时。 后来的某一天&#xff0c;笔者将原来的H3C AP&#xff08;11AC&#xff09;升级为锐捷AP&#xff08;11AX&#xff09;。 在之后的几个月中&#xff0c;发现这块电子万年…

Linux常用命令——setsebool命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) setsebool 修改SElinux策略内各项规则的布尔值 补充说明 setsebool命令是用来修改SElinux策略内各项规则的布尔值。setsebool命令和getsebool命令是SELinux修改和查询布尔值的一套工具组。SELinux的策略与规则…

【云原生】Prometheus 监控系统的初步了解与系统搭建

内容预知 前言 1. Prometheus的相关知识 1.1 Prometheus的认识与了解 1.2 Prometheus的特点 1.3 Prometheus存储引擎TSDB 的特点优势 1.4 Prometheus 的生态组件 &#xff08;1&#xff09;Prometheus server &#xff08;2&#xff09;Client Library &#xff08;3&a…

主流的操作系统(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

如何安装双系统与多系统(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

开放式基金净值历史数据 API 数据接口

开放式基金净值历史数据 API 数据接口 实时净值&#xff0c;历史数据&#xff0c;多维度指数参数。 1. 产品功能 支持所有开放式基金净值历史数据查询&#xff1b;可定义查询指标与时间范围&#xff1b;支持所有开放式基金净值历史数据查询&#xff1b;不同的输入指标返回不同…

java-List

java-List1. 预备知识-泛型(Generic)1.1 泛型的引入1.2 泛型的分类1.3 泛型类的定义的简单演示1.4 泛型背后作用时期和背后的简单原理1.5 泛型类的使用1.6 泛型总结2. 预备知识-包装类(Wrapper Class)2.1 基本数据类型和包装类直接的对应关系2.2 包装类的使用&#xff0c;装箱(…

Windows压缩工具 “ Bandizip与7-zip ”(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

机器视觉在烟草领域中的应用

一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.26 Last edited: 2023.1.26 目录 机器视觉在烟草领域中的应用 烟叶外观检测 烟末原料异物检测 叶梗烟丝缺陷检测 香烟过滤嘴外型检测…

(21)go-micro微服务logstash使用

文章目录一 Logstash介绍二 Logstash作用三 Logstash工作原理四 Logstash安装1.拉取镜像2.运行命令3.查看是否运行五 Logstash使用六 最后一 Logstash介绍 Logstash是具有实时流水线能力的开源的数据收集引擎。Logstash可以动态统一不同来源的数据&#xff0c;并将数据标准化到…

活动星投票自控好声音网络评选微信的投票方式线上免费投票

“自控好声音”网络评选投票_投票平台的陆续发展_小程序投票的好处与坏处_如何进行有效的图文投票近些年来&#xff0c;第三方的微信投票制作平台如雨后春笋般络绎不绝。随着手机的互联网的发展及微信开放平台各项基于手机能力的开放&#xff0c;更多人选择微信投票小程序平台&…

恶意代码分析实战 17 C++代码分析

17.1 Lab20-01 问题 在0x401040处的函数采用了什么参数&#xff1f; 首先&#xff0c;以①处的一个对new操作符的调用开始&#xff0c;这表明它正在创建一个对象。一个对象的引用会在EAX寄存器中返回最终存储在②处的var_8变量和③处的var_4变量中。var_4变量在④处被移到了E…

pytorch深度学习基础(十)——常用线性CNN模型的结构与训练

线性CNN模型的结构与训练引入包LeNet模型结构模型构建AlexNet模型结构模型构建VGG模型结构模型构建加载数据集累加器精度训练引入包 import torch from torch import nn from torchvision import datasets from torchvision import transforms from torch.utils.data import D…