C#实现六大设计原则之接口隔离原则

 更新时间:2022年02月08日 09:41:15   作者:痕迹g  
这篇文章介绍了C#实现六大设计原则之接口隔离原则的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

接口隔离原则(ISP)定义:

客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

问题由来:

类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。

解决方案:

将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。

举例来说明接口隔离原则:

类A依赖接口I中的方法1、方法2、方法3,类B是对类A依赖的实现。

类C依赖接口I中的方法1、方法4、方法5,类D是对类C依赖的实现。

对于类B和类D来说,虽然他们都存在着用不到的方法(也就是图中红色字体标记的方法),但由于实现了接口I,所以也必须要实现这些用不到的方法。

code:

public interface I
    {
        void One();
        void Two();
        void Three();
        void Four();
        void Five();
    }
public class B : I
    {
        public void One()
        {
            Console.WriteLine("实现了");
        }

        public void Two()
        {
            Console.WriteLine("实现了");
        }

        public void Three()
        {
            Console.WriteLine("实现了");
        }

        public void Four()
        {
        }

        public void Five()
        {

        }
        
    }
public class D : I
    {
        public void One()
        {
            Console.WriteLine("实现了");
        }

        public void Two()
        {
        }

        public void Three()
        {
        }

        public void Four()
        {
            Console.WriteLine("实现了");
        }

        public void Five()
        {
            Console.WriteLine("实现了");
        }
    }

可以看到,如果接口过于臃肿,只要接口中出现的方法,不管对依赖于它的类有没有用处,实现类中都必须去实现这些方法,这显然不是好的设计。如果将这个设计修改为符合接口隔离原则,就必须对接口I进行拆分。在这里我们将原有的接口I拆分为三个接口,拆分后的设计如图所示:

相对应的代码Code:

public interface I1
    {
        void One();
    }

    public interface I2
    {
        void Two();
        void Three();
       
    }

    public interface I3
    {
        void Four();
        void Five();
    }
public class B : I1,I2
    {
        public void One()
        {
            Console.WriteLine("实现了");
        }

        public void Two()
        {
            Console.WriteLine("实现了");
        }

        public void Three()
        {
            Console.WriteLine("实现了");
        }
    }
public class D : I1,I3
    {
        public void One()
        {
            Console.WriteLine("实现了");
        }
        
        public void Four()
        {
            Console.WriteLine("实现了");
        }

        public void Five()
        {
            Console.WriteLine("实现了");
        }
    }

接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。

也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。

上面例子中,将一个庞大的接口变更为3个专用的接口所采用的就是接口隔离原则。在程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活。

接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。

采用接口隔离原则对接口进行约束时,要注意以下几点:

  • 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
  • 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
  • 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

运用接口隔离原则,一定要适度,接口设计的过大或过小都不好。设计接口的时候,只有多花些时间去思考和筹划,才能准确地实践这一原则。

到此这篇关于C#实现六大设计原则之接口隔离原则的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • unity通过Mesh网格绘制图形球体

    unity通过Mesh网格绘制图形球体

    这篇文章主要为大家详细介绍了unity通过Mesh网格绘制图形球体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C#复制数组的两种方式及效率比较

    C#复制数组的两种方式及效率比较

    这篇文章介绍了C#复制数组的两种方式及效率比较,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • C#编译器对局部变量的优化指南

    C#编译器对局部变量的优化指南

    这篇文章主要给大家介绍了关于C#编译器对局部变量的优化指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 获得.net控件的windows句柄的方法

    获得.net控件的windows句柄的方法

    有一个简单的获得控件的句柄的窍门。你将窗体设置为鼠标可捕获,那么你的窗口句柄可以通过使用Windows API捕获。 这个想法在以下的GetHWnd函数中实现:
    2013-04-04
  • 轻松学习C#的装箱与拆箱

    轻松学习C#的装箱与拆箱

    轻松学习C#的装箱与拆箱,在之前的文章简单的提到了轻松学习C#的装箱与拆箱,本文带着大家更加详细的介绍轻松学习C#的装箱与拆箱,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • C#使用钩子获得按键信息的方法

    C#使用钩子获得按键信息的方法

    这篇文章主要介绍了C#使用钩子获得按键信息的方法,实例分析了C#中钩子的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-05-05
  • C# BinaryReader实现读取二进制文件

    C# BinaryReader实现读取二进制文件

    在 C# 以二进制形式读取数据时使用的是 BinaryReader 类。本文介绍了C# BinaryReader实现读取二进制文件,感兴趣的可以了解一下
    2021-06-06
  • C#实现三元组的使用示例

    C#实现三元组的使用示例

    本文介绍了C#中的三元组数据结构,以及如何使用三元组在C#中进行一些特定的计算,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • C#获取文件创建时间的方法

    C#获取文件创建时间的方法

    这篇文章主要介绍了C#获取文件创建时间的方法,涉及C#文件操作的技巧及CreattionTime属性的使用方法,需要的朋友可以参考下
    2015-04-04
  • .NET创建、删除、复制文件夹及其子文件的实例方法

    .NET创建、删除、复制文件夹及其子文件的实例方法

    .NET创建、删除、复制文件夹及其子文件的实例方法,需要的朋友可以参考一下
    2013-03-03

最新评论