文档章节

设计模式六大原则:接口隔离原则

o
 osc_kwrafgul
发布于 2019/04/10 10:10
字数 1003
阅读 30
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

目录: 

  设计模式六大原则:单一职责原则

  设计模式六大原则:接口隔离原则 

  设计模式六大原则:依赖倒置原则

  设计模式六大原则:里氏替换原则

  设计模式六大原则:迪米特法则

  设计模式六大原则:开闭原则

接口隔离原则(Interface Segregation Principle):

  1、客户端不应依赖它不需要的接口

  2、类间的依赖关系应该建立在最小的接口上

  其实通俗来理解就是,不要在一个接口里面放很多的方法,这样会显得这个类很臃肿。接口应该尽量细化,一个接口对应一个功能模块,同时接口里面的方法应该尽可能的少,使接口更加灵活轻便。或许有的人认为接口隔离原则和单一职责原则很像,但两个原则还是存在着明显的区别。单一职责原则是在业务逻辑上的划分,注重的是职责。接口隔离原则是基于接口设计考虑。例如一个接口的职责包含10个方法,这10个方法都放在同一接口中,并且提供给多个模块调用,但不同模块需要依赖的方法是不一样的,这时模块为了实现自己的功能就不得不实现一些对其没有意义的方法,这样的设计是不符合接口隔离原则的。接口隔离原则要求"尽量使用多个专门的接口"专门提供给不同的模块。

经典案例:

  类A通过Interface1依赖类B,1,2,3;类B通过Interface1依赖D,1,4,5。

  

  1 internal class Program
  2 {
  3     private static void Main(string[] args)
  4     {
  5         A a = new A();
  6         B b = new B();
  7         a.use1(b);
  8         a.use2(b);
  9         a.use3(b);
 10     }
 11 }
 12 
 13 internal interface interface1
 14 {
 15     void operation1();
 16 
 17     void operation2();
 18 
 19     void operation3();
 20 
 21     void operation4();
 22 
 23     void operation5();
 24 }
 25 
 26 internal class B : interface1
 27 {
 28     public void operation1()
 29         {
 30             Console.WriteLine($"B->{nameof(operation1)}");
 31         }
 32 
 33     public void operation2()
 34         {
 35             Console.WriteLine($"B->{nameof(operation2)}");
 36         }
 37 
 38     public void operation3()
 39         {
 40             Console.WriteLine($"B->{nameof(operation3)}");
 41         }
 42 
 43     public void operation4()
 44         {
 45             Console.WriteLine($"B->{nameof(operation4)}");
 46         }
 47 
 48     public void operation5()
 49         {
 50             Console.WriteLine($"B->{nameof(operation5)}");
 51         }
 52 }
 53 
 54 internal class D : interface1
 55 {
 56     public void operation1()
 57         {
 58             Console.WriteLine($"D->{nameof(operation1)}");
 59         }
 60 
 61     public void operation2()
 62         {
 63             Console.WriteLine($"D->{nameof(operation2)}");
 64         }
 65 
 66     public void operation3()
 67         {
 68             Console.WriteLine($"D->{nameof(operation3)}");
 69         }
 70 
 71     public void operation4()
 72         {
 73             Console.WriteLine($"D->{nameof(operation4)}");
 74         }
 75 
 76     public void operation5()
 77         {
 78             Console.WriteLine($"D->{nameof(operation5)}");
 79         }
 80 }
 81 
 82 internal class A
 83 {
 84     public void use1(interface1 interface1)
 85         {
 86             interface1.operation1();
 87         }
 88 
 89     public void use2(interface1 interface1)
 90         {
 91             interface1.operation2();
 92         }
 93 
 94     public void use3(interface1 interface1)
 95         {
 96             interface1.operation3();
 97         }
 98 }
 99 
100 internal class C
101 {
102     public void use1(interface1 interface1)
103         {
104             interface1.operation1();
105         }
106 
107     public void use4(interface1 interface1)
108         {
109             interface1.operation4();
110         }
111 
112     public void use5(interface1 interface1)
113         {
114             interface1.operation5();
115         }
116 }
view code

  显然,上述设计不符合接口隔离原则。

  

  1 internal class Program
  2 {
  3     private static void Main(string[] args)
  4     {
  5         A a = new A();
  6         B b = new B();
  7         a.use1(b);
  8         a.use2(b);
  9         a.use3(b);
 10     }
 11 }
 12 
 13 internal interface interface1
 14 {
 15     void operation1();
 16 }
 17 
 18 internal interface interface2
 19 {
 20     void operation2();
 21 
 22     void operation3();
 23 }
 24 
 25 internal interface interface3
 26 {
 27     void operation4();
 28 
 29     void operation5();
 30 }
 31 
 32 internal class B : interface1, interface2
 33 {
 34     public void operation1()
 35         {
 36             Console.WriteLine($"B->{nameof(operation1)}");
 37         }
 38 
 39     public void operation2()
 40         {
 41             Console.WriteLine($"B->{nameof(operation2)}");
 42         }
 43 
 44     public void operation3()
 45         {
 46             Console.WriteLine($"B->{nameof(operation3)}");
 47         }
 48 }
 49 
 50 internal class D : interface1, interface3
 51 {
 52     public void operation1()
 53         {
 54             Console.WriteLine($"D->{nameof(operation1)}");
 55         }
 56 
 57     public void operation4()
 58         {
 59             Console.WriteLine($"D->{nameof(operation4)}");
 60         }
 61 
 62     public void operation5()
 63         {
 64             Console.WriteLine($"D->{nameof(operation5)}");
 65         }
 66 }
 67 
 68 internal class A
 69 {
 70     public void use1(interface1 interface1)
 71     {
 72         interface1.operation1();
 73     }
 74 
 75     public void use2(interface2 interface2)
 76     {
 77         interface2.operation2();
 78     }
 79 
 80     public void use3(interface2 interface2)
 81     {
 82         interface2.operation3();
 83     }
 84 }
 85 
 86 internal class C
 87 {
 88     public void use1(interface1 interface1)
 89     {
 90         interface1.operation1();
 91     }
 92 
 93     public void use4(interface3 interface3)
 94     {
 95         interface3.operation4();
 96     }
 97 
 98     public void use5(interface3 interface3)
 99     {
100         interface3.operation5();
101     }
102 }
view code

原文出处:https://www.cnblogs.com/az4215/p/11481076.html

o
粉丝 1
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Hbase的Windows访问接口库--libhbase4win

libhbase4win是基于Thrift的Hbase的Windows访问接口库,开发工具使用VS2010,Hadoop版本为1.1.0,Hbase版本为0.94.0,thrift版本0.9.0,执行编译需要boost和thrift支持。...

张子良
2013/03/06
757
0
ORM数据访问组件--ELinq

ELinq 是一个轻量简单易用的开源Linq ORM数据访问组件,支持Nullable类型和枚举类型,对Linq的谓词提供了完美的支持,旨在让绝大部份的主流数据库都使用 Linq 来进行程序开发,让开发人员访问...

netcasewqs
2012/12/17
2K
2
统一数据库访问接口--edbc

edbc 是 Emacs-Lisp Database Connectivity 的缩 写 ,是从 Emacs-CGI 项目中独立出来的一个子项目,为 Emacs Lisp 访问数据库提供简洁、统一的接口! 在其他语言(比如Java)中访问数据库,...

redraiment
2012/12/26
1.5K
0
商铺记账系统软件--bluebee蓝蜜蜂记账系统

此项目已废弃:) Donate捐助 bluebee accounting system is a popular and free accounting system for individual businesses.This system focus on the individual businesses operation......

刘学炜
2013/04/18
1.4W
10
[译] WPF MVVM 循序渐进(从基础到高级)

本文翻译自Shivprasad koirala在CodeProject上的文章:[WPF MVVM step by step (Basics to Advance Level)][1] 简介 从我们还是儿童到学习成长为成年人, 生命一直都在演变。 对于软件架构, ...

不插电码农
2015/11/27
1.5K
1

没有更多内容

加载失败,请刷新页面

加载更多

什么是移动语义? - What is move semantics?

问题: I just finished listening to the Software Engineering radio podcast interview with Scott Meyers regarding C++0x . 我刚刚结束了对Scott Meyers进行的有关C ++ 0x的Software En......

技术盛宴
59分钟前
24
0
算法与数据结构体系课

算法与数据结构体系课【超清原画】 下载地址:百度云盘 从0到工作5年,面试、进大厂、搭建知识体系、拓展技术上限 你不再需要其它算法与数据结构课程了 为什么学算法已经是一个不应该问的问题...

1930133570
今天
21
0
如何停止跟踪并忽略对Git中文件的更改? - How to stop tracking and ignore changes to a file in Git?

问题: I have cloned a project that includes some .csproj files. 我已经克隆了一个包含一些.csproj文件的项目。 I don't need/like my local csproj files being tracked by Git (or bei......

富含淀粉
今天
25
0
Redis阻塞

可能存在问题 内在原因:API或数据结构使用不合理、CPU饱和、持久化阻塞等 外在原因:CPU竞争、内存交换、网络问题等 问题处理: API或数据结构使用不合理,可能存在慢查询或者大对象: 发现...

游泳鸟
今天
17
0
OSChina 周五乱弹 —— 来人,上幼儿园老师跳舞的图!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 小小编辑:《奇跡の海》- 坂本真綾 《奇跡の海》- 坂本真綾 手机党少年们想听歌,请使劲儿戳(这里) 巴蜀(@巴拉迪维)最近有点闹心了, @巴...

小小编辑
今天
64
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部