首页 > 其他分享 >把接口当作参数传入

把接口当作参数传入

时间:2024-10-17 14:13:04浏览次数:1  
标签:原则 当作 实现 传入 接口 logger 父类 public

1. 基础概念

  • 前段时间一直在看设计模式的基础概念,总结起来其实也就是一些老生常谈的各种原则和定义,初看这些原则和定义实来枯燥乏味,但是一番实践之后,却又发现它们简练而不失准确性,故贴在笔记开头,方便随时对照:
 - 目标:高内聚,低耦合/复用性高(一些相互关联的方法就应该放一个类里面,叫高内聚;类与类之间需要更少的依赖,叫做低耦合)
 - 设计原则:
    - 单一职责原则:一个类负责的东西需要专精
    - 依赖倒置原则:需要面向接口(抽象类)编程,而不是面向实现编程
    - 开闭原则:拓展原有代码的方式应该是在原有代码的基础上拓展,而不是直接修改原有的代码
    - 接口隔离原则:创造更多的专用接口,而不是用一个单一的总接口
    - 里氏替换原则:父类出现的地方都可以使用子类替代,且功能不会发生影响
    - 合成复用原则:尽力使用对象的组合/聚合(集合关系和组成关系),而不要过多的使用继承
    - 迪米特原则:交互的内容尽量小,影响才会最小(通过方法传参,通过字段,通过属性等等方式用来交互会比较好,比较清晰)

    开闭原则是目标,里氏转换原则是基础,依赖倒置原则是手段。
    隔离变换。
    针对接口编程,而不是针对实现编程。

2. 关于接口的探讨

  • 经过一段时间的OOP以及设计模式的训练之后,我逐渐习惯用接口隔离变化的思维方式:即把对象分类,用接口来区分不同类的区别(它们可能需要实现的东西是一样的,但是具体实现的方法是不同的,比如对模块写入电压模式或者电阻模式,其实都是写入模式<方法名>,但是写入的具体数据内容和长度那是完全不同的<方法体>)
  • 和继承相比,虽然父类也可以用virtual这种虚方法,再在子类中ovrride来实现。但是父类毕竟不如接口灵活(一个接口就封装一类变化,但是一个父类用来封装一组变化始终感觉比较奇怪);另外接口不需要继承,只需要实现,所以可以对需要实现接口的类细分出好多种不同的接口,程序的灵活性又+1.
  • 还是原则上提的:针对接口编程,而不是针对实现编程。,父类老老实实当一个abstract的容器最好,OOP上多用接口,少用继承。(一个父类可以被好多个子类继承,那么在实现的时候,就可以通过开闭原则来使得程序更加灵活,毕竟可以一对多实现(当然,接口也有这样的特点,甚至比继承更灵活))。
  • 说到一对多实现这一点,这里就多说一点关于简单工厂,反射工厂,抽象工厂这几种最常用的设计模式:
    • 简单工厂:它也不属于设计模式,它的简单原理就是通过switch..case of来判定当前输入的Enum元素是哪个,判断出哪个就返回哪个,灵活性+1;
    • 反射工厂,它在基本原来上和简单工厂一样,但是加入一些语法糖(比如C#的default(T) = typeof()这种反射机制),省略switch的硬编码,使得程序更加简单易懂。
    • 抽象工厂,这就是利用抽象父类当个容器,你想要实现实现哪个子类你就在构造函数中以哪个子类来创建对象,反正抽象父类类型可以对应所有的实例子类。

3. 好多地方喜欢把接口当作参数传入的原因?

  • 最开始我的理解如上,接口就是用来隔离变化,以更好的override变化。所以每次如果需要实现某种接口的时候,我就直接实现接口对应的类就好了。
  • 但是:如果想更加灵活的实现接口(比如我写了很多个类,每一个类都继承了同一个接口,但这个时候这些类是没有一个统一的父类的,做不到一对多(里氏转换原则)),这个时候就需要把接口当作一个共同的类型,你只要知道调用时接口是通过哪个类实现的,你就可以实现灵活的调用接口
  • 看代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace test
{
    //定义接口
    public interface ILogger
    {
        void Log(string message);
    }
    //实现接口的类
    public class ConsoleLogger : ILogger
    {
        public void Log(string message)
        {
            Console.WriteLine(message);
        }
    }
    //使用接口作为参数传递的方法
    public class Processer
    {
        private readonly ILogger _logger;
        public Processer(ILogger logger)//从构造函数处实现接口的传入
        {
            _logger = logger;
        }
        public void Process()//使用接口的方法,但在真实调用之前这些方法都是虚的
        {
            _logger.Log("abcd");
            _logger.Log("efgh");
        }
    }
    //调用过程,此时才真正给接口分配真实实现方法
    public class Program
    {
        public static void Main(string[] args)
        {
            ILogger logger = new ConsoleLogger();//此处真正关联接口和接口的实现
            Processer processer = new Processer(logger);//传入已经实例后的接口
            processer.Process();//调用实现方法
        }
    }
}

标签:原则,当作,实现,传入,接口,logger,父类,public
From: https://www.cnblogs.com/xiacuncun/p/18472116

相关文章

  • 晶尊微电子MC802单片机:专为需要多IO接口的产品设计
    MC802单片机:触控未来,8位高性能与多IO接口的完美结合MC802(2TouchKey+4I/O)MC802是由厦门晶尊微电子科技有限公司(ICman)推出的一款高性能8位单片机,它集成了2个自校正容性触摸按键和4个I/O口,专为需要多IO接口的产品设计而优化。MC802适用于多种应用场景,如遥控器、风扇、灯光控......
  • 券商api怎么获取,如何获取券商API接口?
    炒股自动化:申请官方API接口,散户也可以python炒股自动化(0),申请券商API接口python炒股自动化(1),量化交易接口区别Python炒股自动化(2):获取股票实时数据和历史数据Python炒股自动化(3):分析取回的实时数据和历史数据Python炒股自动化(4):通过接口向交易所发送订单Python炒股自动化(5):......
  • 开发一个API接口需要懂的关键技术
    开发一个API接口涉及多种关键技术,这些技术协同工作以确保API的高效、安全和易用。以下是五个关键技术及其简要解释:1. 后端编程语言作用和重要性:后端编程语言用于编写API的服务器端逻辑。它处理客户端请求,执行必要的业务逻辑,并返回响应。选择合适的语言(如Node.js、Python、J......
  • Java 8 的 Lambda、函数式接口、Stream 用法和原理
    我是风筝,公众号「古时的风筝」。一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农!文章会收录在JavaNewBee中,更有Java后端知识图谱,从小白到大牛要走的路都在里面。公众号回复『666』获取高清大图。就在今年Java25周岁了,可能比在座的各位中的一些......
  • 具有GPS功能的监控设备接入as-v1000视频监控平台后,上层应用软件通过as-v1000视频监控
    目录一、什么是设备GPS轨迹二、设备GPS轨迹的应用场景        1、车辆追踪        2、个人定位        3、物流运输        4、资产安全        5、数据分析三、查询设备GPS轨迹的作用        1、实时监控与追踪 ......
  • Spring Cloud Gateway关键点全局Token过滤器,局部过滤器接口耗时,全链路跟踪TraceId日志
    一.全局Token过滤器在SpringCloudGateway中,实现全局过滤器的目的是对所有进入系统的请求或响应进行统一处理,比如添加日志、鉴权等。下面是如何创建一个全局过滤器的基本步骤:步骤1:创建过滤器类首先,你需要创建一个实现了GlobalFilter接口,创建一个全局token过滤器。@Slf......
  • java基础(6)抽象类和接口
    目录​编辑1.前言2.正文2.1抽象类2.1.1抽象类的概念2.1.2抽象类的语法2.1.3抽象类的特点2.1.4抽象类的作用2.2接口2.2.1接口的概念2.2.2接口的用法2.2.3接口的特点2.2.4实现多个接口2.2.5接口间的继承 2.2.6抽象类和接口的区别3.小结1.前言哈喽大家好吖,......
  • TypeScript新手学习教程--接口
    TypeScript也支持接口,跟Java类似,这对于学习过java,c#,php语言的人更容易上手,虽然类似,但是也有不同,下面开始学习。1、 接口声明TypeScript的核心原则之一是对值所具有的结构进行类型检查。它有时被称做“鸭式辨型法”或“结构性子类型化”。在TypeScript里,接口的作用就是为......
  • 拥抱AI-海关机场护照查验-护照查验接口-护照识别真伪核验
    在全球化日益加深的今天,国际旅行已成为人们生活中不可或缺的一部分。无论是商务出行还是休闲旅游,护照作为国际通行的身份证明文件,其真实性和有效性至关重要。为了确保国家安全和旅客的顺利通关,海关机场在护照查验过程中采用了先进的护照识别真伪核验技术。什么是护照查验......
  • 点阵数码管显示屏驱动VK16K33C SOP20高亮LED数显屏驱动芯片,内置RC振荡器, I2C通讯接口
    产品品牌:永嘉微电/VINKA产品型号:VK16K33C封装形式:SOP20概述VK16K33C是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有数据锁存器、键盘扫描、LED驱动模块等电路。数据通过I2C通讯接口与MCU通信。SEG脚接LED阳极,GRID脚接LED阴极,可支持8SEGx8GRID的点阵LE......