实现“第 24”种设计模式

用Multisim仿真AD630锁定放大器:从2012年电赛A题实战到避坑指南 本文详细介绍了如何使用Multisim仿真AD630锁定放大器,从2012年电赛A题实战出发,提供完整的电路搭建、参数优化及避坑指南。重点解析AD630的开关调制架构和双相位检测的工程实现,帮助读者在强噪声背景下有效提取微弱信号,提升电子设计竞赛和工程实践中的信号处理能力。 阅读详情

传统方案

if-else 在我们编程时出现的频率,无需我多赘述。当逻辑复杂时,我们会写出很多 if-else 语句,于是网络上充斥着大量的相关文章,教我们如何去除if-else,大多大同小异。

归结下来,无非是策略模式、责任链模式等套路,它们目的都是一样的,都希望把逻辑打散在一个个类中,再通过一个工厂或者什么别的玩意去调度它们。

这些策略可以很好的处理以下语句:

if (cond) {
    do
} else if (cond){
    do
} else if (cond){
    do
} else if (cond){
    do
} else {
    do
}

由于 go 本身是支持函数作为一等公民,所以不怎么需要面向对象语言的设计模式,Java 虽然需要通过一些设计模式的支持,但总归也不是很复杂,这里以 go 为例:

package main

type Cond func(param interface{}) bool
type Do func()

var cond1 = func(param interface{}) bool {
   return false
}

var do1 = func() {}

var condMap = map[Cond]Do{
   cond1: do1,
}

func main(){
    for k, v := range condMap {
       if k(param) {
          v()
       }
    }
}

我们把条件和动作设计成两个函数:Cond \ Do ,就可以用 Map 去存储和扩展它。
Cond 和 Do 可以无限的新增下去。

更多的思考🤔

以上传统方案做法上没什么问题,但在设计上,却存在两个问题:

一、存在过度设计的嫌疑

首先, 如果真的只是例子中这种扁平的(指一层)if-else,即使它加到 100 个,也不会很复杂,本来也就很符合人类的思维习惯,一个个往下看就是了(人类很喜欢顺序和规律)。

过度设计是指为不属于当前业务需求(或短期可预见的需求)进行设计,说白了就是臆想一些场景,去兼容这些场景做设计。

如果可以预见的,这些扁平的if-else不会有大量的新增、删除操作,那就没必要使用这些设计模式;如果可以预见这些 if-else 会大量新增、删除,或者会被其他人维护,那使用这些模式进行改造倒是可行的。

二、无法解决if-else嵌套问题

对于多层的if-else,示例代码如下:

if (cond){
    if (cond){
        do
    } else if (cond){
        if (cond) {
            do
        } else if (cond){
            if (cond) {
                do
            } else if (cond){
                do
            } else if (cond){
                if (cond) {
                    do
                } else if (cond){
                    do
                } else {
                    do
                }
            }
        } else {
            do
        }
    }
} else {
    do
}

相信这种嵌套的if-else才是日常开发经常碰到的情况,可能没有示例这么夸张,但我们可以看出,这种不太好用策略或者责任链去解决。

策略套策略?也层层嵌套下去?

这种代码会更加的复杂,还不如不重构。

新方案:分支树

思考一下,这种嵌套的 if-else 是不是构成了一棵分支树,树的叶子节点就是某种操作,树的非叶子节点就是某个判断。

进入公园分支树.png

我们以一个日常生活场景:“入园政策”为例,这个场景就构成了一棵分支树。那么既然是树结构,我们就应该用树结构去表示它。

在机器学习中,也有相似的概念,称之为决策树。但是,机器学习的目标主要是怎么通过大量的数据,识别和构造出一个决策树,也就是图中这些条件本来是不存在的,需要通过学习去自动生成。而我们的场景是已存在 if-else 构成的分支树,我们要通过一种树结构去优化表示它。所以目的是不同的,我也用了新的名字:分支树。

要构造这样一棵分支树,我们先规定好树节点,分为两类:决策节点和叶子节点。决策节点负责判断数据是否符合条件,是则进入它的子节点,否则访问它的下个兄弟节点;叶子节点包含执行逻辑,一个个决策节点走下来,最终一定要走到一个叶子节点,不然这棵树就没有意义。

未命名绘图.drawio.png

节点接口定义如上,DecisionRule 用来决策,ChildrenList 用于构造树。抽象了一个 Node,用于标识节点。

这里我原本想试试把接口方法中的 interface{} 换成泛型参数[T any],但实际上做不到。似乎是 Go 不支持这种泛型方法,各位可以试试。

有了节点,我们接下来要实现这棵分支树:

未命名绘图.drawio (1).png

如同我们实现一棵二叉树一样,我们一般都会定义一个根节点,它起到一个引领作用,没有根节点,我们无法拿到这个树。

我们还定义了一个节点 Map,保存了这棵树的所有节点,这与一般的树实现不同,这是为什么呢?

这是为了松耦合,我们在前面的接口定义中,将ChildrenList的返回值规定为[]string,也就是不需要返回 Node 结构,只需要返回 ID 标识。这样,我们就无需一定要先定义出叶子节点,只需要规定好叶子节点的 ID 标识。

这样的话,我们不需要从下到上的顺序去实现树的节点,而是可以以任意顺序,只要 ID 能对的上即可。所以我们需要一个节点 Map,能够根据 ID 标识去找到这个节点。

AddNode() 可以添加一个节点到树中,AddNode 会自动识别,把节点放在它在树中的正确位置。

当树的所有节点都添加好了,调用 Decision() ,遍历这个分支树,遍历到某个叶子节点,就会执行它的 Do 函数。这个遍历我们应该选用 BFS 遍历,不能使用 DFS 遍历,因为我们要一层一层的处理。

我们用一个实际的分支树来做个例子:

//                                           ┌──────┐
//                                           │ Root │
//                                           └──────┘
//                                               ▲
//                  ┌────────────────────────────┼──────────────────────┐
//                  │                            │                      │
//           ┌────────────┐          ┌───────────────────────┐   ┌─────────────┐
//           │  age < 18  │          │ age >= 18 & age < 60  │   │  age >= 60  │
//           └────────────┘          └───────────────────────┘   └─────────────┘
//                  ▲                            ▲                      ▲
//          ╱──────╱ ╲──────╲                    │                      │
//         ╱                 ╲            ╔════════════╗       ╔═════════════════╗
// ┌───────────────┐ ┌───────────────┐    ║ buy ticket ║       ║ discount ticket ║
// │ height < 1.2  │ │ height >= 1.2 │    ╚════════════╝       ╚═════════════════╝
// └───────────────┘ └───────────────┘
//         ▲                 ▲
//         │                 │
//    ╔═════════╗     ╔════════════╗
//    ║  enter  ║     ║ buy ticket ║
//    ╚═════════╝     ╚════════════╝

使用步骤如下代码所示:


func main() {
   tree := branch_tree.DecisionTree{}

   // 1. 定义叶子节点
   // 如上所说,我们例子里虽然先定义了叶子节点,但实际上这个顺序是可以打乱的
   enterNode := &EnterPark{}
   buyTicketNode := &BuyTicket{}
   discountTicketNode := &DiscountTicket{}

   // 2. 定义决策节点
   lessHeight := &HeightDecisionNode{
      Id: "H<120cm",
      DecisionFunc: func(param interface{}) bool {
         if p, ok := param.(*People); ok {
            return p.Height < 120
         }
         return false
      },
      Childs: []string{enterNode.ID()},
   }
   geHeight := &HeightDecisionNode{
      Id: "H>=120cm",
      DecisionFunc: func(param interface{}) bool {
         if p, ok := param.(*People); ok {
            return p.Height >= 120
         }
         return false
      },
      Childs: []string{buyTicketNode.ID()},
   }

   ageLess18 := NewAgeDecisionNode(0, 18)
   ageIn18And60 := NewAgeDecisionNode(18, 60)
   ageG60 := NewAgeDecisionNode(60, math.MaxInt)

   ageLess18.SetChilds([]string{lessHeight.ID(), geHeight.ID()})
   ageIn18And60.SetChilds([]string{buyTicketNode.ID()})
   ageG60.SetChilds([]string{discountTicketNode.ID()})
   

   // 3. 把以上节点加到树中
   err := tree.AddNode(enterNode)
   err = tree.AddNode(buyTicketNode)
   err = tree.AddNode(discountTicketNode)
   err = tree.AddNode(lessHeight)
   err = tree.AddNode(geHeight)
   err = tree.AddNode(ageLess18)
   err = tree.AddNode(ageIn18And60)
   err = tree.AddNode(ageG60)
   if err != nil {
      panic(err)
   }

   // 4. 接下来把数据输入到树中决策。
   err = tree.Decision(&People{
      Age:    16,
      Height: 150,
   })
   if err != nil {
      panic(err)
   }
   // 应该执行:Buy ticket

   err = tree.Decision(&People{
      Age:    8,
      Height: 110,
   })
   if err != nil {
      panic(err)
   }
   // 应该执行:Enter

   err = tree.Decision(&People{
      Age:    61,
      Height: 160,
   })
   if err != nil {
      panic(err)
   }
   // 应该执行:Discount

   err = tree.Decision(&People{
      Age:    45,
      Height: 160,
   })
   if err != nil {
      panic(err)
   }
   // 应该执行:Buy ticket

   // Run result:
   // I will buy ticket.
   // I will enter park.
   // I will discount.
   // I will buy ticket.
}

所有代码均在 Github 开源,欢迎 Star。

感谢观看~ 🎶

求职(远程、Golang)启事
本人非 985、211,普通本科大学,无大厂经历😂。
有一颗对技术充满热情的心和喜欢独立思考的大脑,单兵作战能力强。
SAIL作者,设计开发过多款业务、技术系统,也经历过高并发的洗礼。
如果您愿意让我成为您的同事,可私聊我或者通过邮箱(690174435@qq.com)与我联系。

【系统架构设计师】模拟预测试卷十 - 案例分析(完整结构) 本文为系统架构设计师考试模拟试题及参考答案,包含五个专题:质量属性(必答)、信息系统架构设计、嵌入式系统架构设计、云原生架构设计、面向服务架构设计(SOA)。试题一聚焦非功能需求与质量属性映射,如性能、可修改性、一致性等;其余选答题分别涉及分层架构设计(如嵌入式实时控制)、云原生会话管理、服务化治理(如契约设计、熔断策略)等核心架构场景,涵盖战术应用、权衡分析及解决方案设计。参考答案提供关键要点,例如离线借还的冲突解决、服务编排与共享服务的区分、嵌入式硬实时保护的必要性等,适用于备考实战演练。 阅读详情

相关推荐

Unity URP项目里Post Processing死活没效果?别急,这5个坑我帮你踩过了

本文详细解析了Unity URP项目中Post Processing效果不显示的5个常见问题及解决方案,包括管线配置、Volume设置、摄像机选项、Layer冲突和Shader兼容性。通过专业排查步骤和实用代码片段,帮助开发者快速定位并修复后处理效果失效问题,提升项目开发效率。

weixin_28693309的博客 233

设计模式大全

  Longronglin之设计模式:Christopher Alexander 说过:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。模式描述为:在一定环境中解决某一问题的方案,包括三个基本元素--问题,解决方案和环境。阅读类图和对象图请先学习UML创建模式 结构模式 行为模式创建模式:对类

马如林的IT博客 8万+

【移远EG800K-CN】从AT指令到MQTT实战:4G模块云端通信全解析

本文详细解析移远EG800K-CN 4G模块的AT指令应用与MQTT云端通信实战。从硬件连接到网络配置,再到MQTT协议的数据上报与命令接收,提供了完整的物联网通信解决方案,帮助开发者快速实现设备与云端的稳定数据交互。

o1p2q3r的博客 559

Java 24种设计模式

但是对于用户来说,我只是做了一个点击操作,希望得到的结果就是看条新闻啊,你这么多操作,搞这么慢,用户体验很差啊,而且并发量也很低,那不如做成两个小系统,A系统,拉取新闻,推送,并组装一个信息扔给MQ中间件,ok,结束,用户看到新闻。第二,很多中间件设计理念也是基于设计模式的,还有其他的语言,都有自己的设计最佳实践。这边要说两个概念,享元模式对象的属性可以分为两个部分,内部状态和外部状态,内部状态是指不会随环境而改变的值,比如说个人信息,外部状态是指随环境改变的值,不能进行共享的信息,如某大学生选修的课程。

拾一二的博客 3157

Unity PSD分层导入插件ps2d原理与实战指南

PSD作为UI设计主流源文件,其图层结构、混合模式、文字矢量属性等核心语义在传统引擎导入中普遍丢失,导致设计还原度低、多语言适配难、运行时不可控。ps2d通过深度解析PSD二进制规范,将图层映射为GameObject树、文字转为TextMeshPro可编辑组件、形状生成矢量Mesh、蒙版与图层样式编译为定制Shader,实现设计意图的精准程序化表达。该方案显著提升UI开发效率,支撑高保真还原、动态修改、分辨率自适应及运行时热重载等工程需求,是Unity中连接设计师与程序员的关键工作流中枢。

weixin_32943857的博客 348

使用阿里天池平台训练YOLO目标检测模型

YOLO算法是一种单阶段目标检测算法,由Joseph Redmon等人于2015年提出。与传统的两阶段检测算法相比,YOLO将目标检测问题转化为回归问题,直接预测边界框的位置和类别概率,大大提高了检测速度。YOLOv1: 首次提出YOLO的核心思想,将图像分割成网格,每个网格预测边界框和类别概率。YOLOv2: 引入了批量归一化、锚框等改进,提高了检测精度。YOLOv3: 采用多尺度预测,增强了对小目标的检测能力。

步子哥的博客 1090

24种常用设计模式总结(附代码实现)

总纲 面向对象的好处: 运用封装、继承、多态把程序的耦合度降低,用设计模式使得程序更加灵活,容 易修改并易于复用。举个栗子:***雕版印刷***与***活字印刷***,雕版印刷是把所有内容都刻 在一块大木板上,这样一来哪怕只改动一个字就得整块重新雕刻,而活字印刷把一 个个汉字单独雕刻,这样就可以自由组合,灵活修改。 一、简单工厂模式 根据参数决定实例化具体对象,将实例化过程与其他模块分离,就...

Fish的博客 1449

Python 对接钉钉获取员工上一篇日报或周报内容

摘要:本文介绍使用Python对接钉钉API获取员工日报/周报的方法。首先需创建钉钉应用并开通日志权限,获取员工UserID。通过获取AccessToken进行鉴权,调用topapi/report/list查询日志记录,筛选最新日报/周报后,使用topapi/report/details获取详细内容。需注意权限控制、时间范围筛选和模板匹配等问题。文末提供完整代码示例,并建议扩展自动化触发、数据存储等功能。该方法适用于企业自动化获取员工工作日志的场景。

从技术实践立足,从项目管理方法论延伸思考 807

java 24种设计模式

设计模式的七大原则 开闭原则:对扩展开放、对修改关闭。 单一指责原则:一个类只做一件事。 依赖倒转原则:类似于ioc,采用接口编程。 迪米特原则:高内聚,低耦合。 接口隔离原则:应该使用多个接口,而不是用单一的总接口。 合成复用原则:尽量使用对象组合,而不是继承来达到复用目的。 里氏替换原则:子类可以扩展父类的功能,但不能改变原有的功能。 一、创建型模式(5种) 1、单例模式(Singleton) 保证一个类只有一个实例,并提供一个全局访问点。 有四种单例实现方式:https..

sumengnan的博客 2万+

Amesim应用篇-电芯等效电路模型标定

为了使计算模型更加准确,在有电芯实验测试数据的情况下,依据现有的实验数据对Amesim中的电池等效电路模型进行标定。标定的目的是为了获得更加符合项目实际情况的电芯等效电路模型,标定完的电芯可以用于搭建PACK模型,也可以用于其他虚拟实验。本文以充电标定为例,进行介绍。放电标定与充电一致。

2201_75375391的博客 1213

【GameFramework框架】三、快速启动

这篇文章就带领大家如何快速启动GameFramework框架。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 4427

大话24种设计模式详解及实现过程详解

由于设计模式有24种,每种具体的实现和解释都需要一定的时间,所以笔者需要每种模式和本篇文章分开写,每写完一种都会在对应的模式上附上链接,还望大家多多包涵和理解。

张步云的专栏 826

【GlobalMapper精品教程】073:像素到点(Pixels-to-Points)从无人机图像轻松生成点云

Global Mapper v19引入的新的像素到点工具使用摄影测量原理,从重叠图像生成高密度点云、正射影像及三维模型。它使LiDAR模块成为已经功能很强大的的必备Global Mapper扩展功能。打开GlobalmapperV25.1中文版,点击【Lidar分析】→【像素到点云】,如下所示:V25之前的版本点击工具条上的【像素到点】工具:打开工具,可以【使用向导选】,或者选择【使用主窗口】,都很简单。

智慧空间实验室 1972

HarmonyOS ArkTS API 24:构建智能学习笔记管理与复习规划平台“接口定义数据契约 + 类实现可观察行为“的设计模式在 ArkTS 中非常常见,它实现了数据结构与行为能力的分离

在移动互联网与智能穿戴设备高度普及的今天,"习惯养成"已经从一个模糊的自我管理理念,演变为一个可量化、可追踪、可视化的数字化产品赛道。越来越多的人希望借助手中的智能终端,把"早起、冥想、阅读、运动"这些抽象的自律行为,转化为一条条清晰的数据曲线和一张张可触摸的打卡卡片。而鸿蒙生态(HarmonyOS)凭借其跨设备协同、分布式软总线以及声明式 UI 开发框架 ArkUI,为这类注重"轻量化交互 + 即时反馈"的生活方式类应用提供了极为理想的生长土壤。本应用正是一款面向"晨间场景"深度打磨的习惯追踪工具。它聚焦

2301_79516720的博客 157

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

24种设计模式(一)

24种设计模式 第1章 简单工厂 第2章 外观模式 第3章 适配器模式 第4章 单例模式 第5章 工厂方法模式 第6章 抽象工厂模式 第7章 生成器模式 第8章 原型模式 第9章 中介者模式 第10章 代理模式 第11章 观察者模式 第12章 命令模式 第13章 迭代器模式 第14章 组合模式 第15章 模版方法模式 第16章 策略模式 第17章 状态模式 第18章 备忘录模式 第19章 享元模式...

zjltju1203的博客 7584

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

24大设计模式总结

设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。在软件开发中,前人对软件系统的设计和开发总结了一些原则和模式, 不管用什么语言做开发,都将对我们系统设计和开发提供指导意义。本文主要将对24种设计模式进行总结和阐述具体意义。创建型(6种)、行为型(11种)、结构型(7种)。

流华追梦的专栏 3158

efm32 入门.pdf

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

[Java]24种设计模式

24种设计模式 第1章 简单工厂 第2章 外观模式 第3章 适配器模式 第4章 单例模式 第5章 工厂方法模式 第6章 抽象工厂模式 第7章 生成器模式 第8章 原型模式 第9章 中介者模式 第10章 代理模式 第11章 观察者模式 第12章 命令模式 第1章 简单工厂 1.简单工厂的定义 提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。 简...

一杯糖不加咖啡 587

java24种经典设计模式

在Java编程领域,有24种经典的设计模式(Design Patterns)。这些设计模式是在软件开发过程中,针对常见问题的最佳实践解决方案。它们经过时间的检验,被广泛应用于各种Java项目中,以提高代码的可重用性、灵活性和可维护性。

专业深耕,技术前沿 1039

24种设计模式大全-牛人详解

Longronglin之设计模式: Christopher Alexander 说过:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。 模式描述为:在一定环境中解决某一问题的方案,包括三个基本元素--问题,解决方案和环境。 阅读类图和对象图请先学习UML 创建模式 结构模式 行为模式 创建模式:对类的

MR_ROG的专栏 1万+

24种设计模式

24种设计模式 文章目录设计原则单例模式工厂模式策略模式门面模式调停者模式责任链模式装饰者模式观察者模式组合模式享元模式静态代理动态代理迭代器模式访问者模式构建者模式适配器模式桥接模式命令模式原型模式模板方法状态模式谈到的一些问题 设计原则 返回目录 单一职责原则 一个类别太大,负责单一的职责 高内聚,低耦合 里氏替换原则 所有使用父类的地方,必须能够透明的使用子类。比如子类重写父类的A()方法之后,又重载了很多的A()方法,那么这样子会照成对父类接口方法的歧义 例:List list = n.

干嘛卷来卷去的博客 820

TypeScript实现的24种设计模式

设计模式的六大原则 0.总原则: 开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。 1.单一职责原则 (Single Responsibility Principle) 不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。 2.里氏替换原则(Liskov Substit

BayMin0-0的博客 1942

浅谈Java中的24种设计模式(详细完整版)

设计模式是很多程序员总结出来的最佳实践。曾经在刚开始写项目的时候学习过设计模式,在开发过程中,也主动或者被动的使用过。现在写代码虽说不会特意明确在用哪种设计模式,但潜移默化的写出来公认的最佳实践代码,毕竟看的比较清爽。为什么再看一遍设计模式,主要有几个原因:第一,很多优秀的源码基本都使用了设计模式,明确设计模式能够更好的看源码。第二,很多中间件设计理念也是基于设计模式的,还有其他的语言,都有自己的设计最佳实践。对于我来说,设计模式始于java,不止于java。第三,有了这种规范,可以更好的和他人沟通,言简意

u011634836的博客 2649

设计模式24种介绍

备忘录模式(Memento Pattern)是一种行为型设计模式,允许在不破坏封装的情况下捕获和恢复对象的状态。它常用于实现撤销/恢复功能。注意事项备忘录的封装性:备忘录应尽可能隐藏状态信息,仅由发起人类操作,防止外界直接访问。存储效率:对于复杂状态对象,需评估备忘录存储的内存开销。备忘录数量管理:可以通过限制备忘录数量或设置存储策略优化性能。public class 备忘录模式 {// 创建发起人// 创建备忘录集合 -管理者// 设置状态并保存// 恢复状态。

weixin_47759174的博客 1017

简单介绍24种设计模式

设计模式是一种经过多年实践证明可用的通用解决方案,它们可以帮助我们在软件开发中更容易地解决一些常见的问题。设计模式分为23种基础模式和一种扩展模式

解决bug的路上 1939

24种设计模式(二)

24种设计模式 第1章 简单工厂 第2章 外观模式 第3章 适配器模式 第4章 单例模式 第5章 工厂方法模式 第6章 抽象工厂模式 第7章 生成器模式 第8章 原型模式 第9章 中介者模式 第10章 代理模式 第11章 观察者模式 第12章 命令模式 第13章 迭代器模式 第14章 组合模式 第15章 模版方法模式 第16章 策略模式 第17章 状态模式 第18章 备忘录模式 第19章 享元模式...

zjltju1203的博客 624

七大原则,24种设计模式,aop多种实现方式

七大设计原则: 1、单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】:一个类负责一项职责. 2、里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】:继承与派生的规则.(子类可替换父类) 3、依赖倒转原则【DEPENDENCE INVERSION PRINCIPLE】:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程。 4、接口隔离原则【INTERFACE SEGREGATIO....

cao919的专栏Net 935
上一篇: 如何做好一个配置中心
下一篇: 一起来聊聊 Go 的核心竞争力
csdnYF
博客等级 码龄12年 406粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值