1. 背景

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

2. 定义

一个类对另一个类的依赖应该建立在最小的接口上,不应该依赖他不需要的接口。

3. 解决方案

将臃肿的接口I拆分为独立的几个接口,类A和类C分别于它们需要的接口建立依赖关系,即接口隔离原则。

4. 模拟场景

接口I中有5个方法, 类A通过接口I依赖于类B,但类A只需要方法1、方法2、方法3;类C通过接口I依赖于类D,但类C只需要方法1、方法4、方法5。

以上这种业务场景:我们发现,对类B来说,方法4和方法5不是必须的,但不得不实现;对于类D来说,方法2和方法3不是必须的,但不得不实现,显然不满足接口隔离原则。

解决方案:将接口I拆分成三个接口 I1、I2、I3;I1中有方法1;I2中有方法2、方法3;I3中有方法4、方法5。B实现接口I1和I2,D实现接口I1和I3;这样就满足最小接口依赖了,即满足接口隔离原则了

  注意:为了和上面的代码区分:A用AA表示,B用BB表示,一次类推

  public interface I1
{
void methord1();
}
  public interface I2
{
void methord2();
void methord3();
}
   public interface I3
{
void methord4();
void methord5();
}
  public class BB : I1, I2
{
public void methord1()
{
Console.WriteLine("类BB实现接口I1的方法1");
} public void methord2()
{
Console.WriteLine("类BB实现接口I2的方法2");
} public void methord3()
{
Console.WriteLine("类BB实现接口I2的方法3");
}
}
  public class DD:I1,I3
{
public void methord1()
{
Console.WriteLine("类DD实现接口I1的方法1");
} public void methord4()
{
Console.WriteLine("类DD实现接口I3的方法4");
} public void methord5()
{
Console.WriteLine("类DD实现接口I3的方法5");
}
}
  public class AA
{
public void Depend1(I1 i)
{
i.methord1();
}
public void Depend2(I2 i)
{
i.methord2();
}
public void Depend3(I2 i)
{
i.methord3();
}
}
  public  class CC
{
public void Depend1(I1 i)
{
i.methord1();
}
public void Depend4(I3 i)
{
i.methord4();
}
public void Depend5(I3 i)
{
i.methord5();
}
}
  public static void show2()
{ //解决上述业务场景,使其满足接口隔离原则
//解决方案:将接口I拆分成三个接口 I1、I2、I3;I1中有方法1;I2中有方法2、方法3;I3中有方法4、方法5。B实现接口I1和I2,D实现接口I1和I3;这样就满足最小接口依赖了,
//即满足接口隔离原则了
//注意:为了和上面的代码区分:A用AA表示,B用BB表示,一次类推
AA aa = new AA();
aa.Depend1(new BB());
aa.Depend2(new BB());
aa.Depend3(new BB());
CC cc = new CC();
cc.Depend1(new DD());
cc.Depend4(new DD());
cc.Depend5(new DD()); }

04-接口隔离原则(ISP)的更多相关文章

  1. C#软件设计——小话设计模式原则之:接口隔离原则ISP

    前言:有朋友问我,设计模式原则这些东西在园子里都讨论烂了,一搜一大把的资料,还花这么大力气去整这个干嘛.博主不得不承认,园子里确实很多这方面的文章,并且不乏出色的博文.博主的想法是,既然要完善知识体系 ...

  2. 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(The Interface Segregation Principle). 英文原文:htt ...

  3. 设计原则:接口隔离原则(ISP)

    接口隔离原则的英文是Interface Segregation Principle,缩写就是ISP.与里氏替换原则一样其定义同样有两种 定义1: Clients should not be force ...

  4. 【面向对象设计原则】之接口隔离原则(ISP)

    接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 从接口隔离原则的定义可以看 ...

  5. 接口隔离原则(ISP)

    设计应用程序的时候,如果一个模块包含多个子模块,那么我们应该小心对模块做出抽象.设想该模块由一个类实现,我们可以把系统抽象成一个接口.但是要添加一个新的模块扩展程序时,如果要添加的模块只包含原系统中的 ...

  6. 面向对象的六大原则之 接口隔离原则——ISP

    ISP = Interface Segregation Principle   ISP的定义如下: 1.客户端不应该依赖他不需要的接口 2.一个类对另外一个类的依赖性应该是建立在最小的接口上 3.不应 ...

  7. IOS设计模式的六大设计原则之接口隔离原则(ISP,Interface Segregation Principle)

    定义 客户端不应该依赖它不需要的接口: 一个类对另一个类的依赖应该建立在最小的接口上. 定义解读 定义包含三层含义: 一个类对另一个类的依赖应该建立在最小的接口上: 一个接口代表一个角色,不应该将不同 ...

  8. 设计模式学习--面向对象的5条设计原则之接口隔离原则--ISP

    一.ISP简介(ISP--Interface Segregation Principle): 使用多个专门的接口比使用单一的总接口要好.一个类对另外一个类的依赖性应当是建立在最小的接口上的.一个接口代 ...

  9. 设计模式六大原则(四):接口隔离原则(Interface Segregation Principle)

    接口隔离原则(ISP)定义: 客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 问题由来: 类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不 ...

  10. 设计模式之六大原则——接口隔离原则(ISP)

    设计模式之六大原则——接口隔离原则(ISP)  转载于:http://www.cnblogs.com/muzongyan/archive/2010/08/04/1792528.html 接口隔离原则 ...

随机推荐

  1. ASP.NET MVC与WebForm对比

    MVC优点:1.分离更彻底,分层清晰,易于维护和扩展.2.验证更加方便快捷.3.无ViewState,页面更加干净4.路由更容易定义url,对SEO比较好.5.强类型VIEW实现,更安全高效. Web ...

  2. MongoDb在windows10下的安装、创建用户和数据库

    1.mongodb下载地址https://www.mongodb.com/download-center#community 2.安装    3.在D:\MongoDB目录下创建db和log两个文件夹 ...

  3. python自动化运维笔记3 —— dns处理模块dnspython

    1.3 DNS处理模块 dnspython是python实现的一个DNS工具包,它支持几乎所有的记录类型,可以用于查询.传输并动态更新ZONE信息,同时支持TSIG(事物签名)验证消息和EDNS0(扩 ...

  4. python之tkinter使用-滚动条

    # GUI:tkinter使用 # 通过调节滚动条改变标签中字体大小 import tkinter as tk def resize(ev=None): '''改变label字体大小''' label ...

  5. codeforces580C

    Kefa and Park CodeForces - 580C 一棵以1为根的树,树上有些点是红的.一个叶子是合法的当且仅当从根到它的路径上出现的连续红点个数不超过m.求有多少个叶子是合法的.Inpu ...

  6. C++拷贝构造函数与 = 重载

    调用拷贝构造函数进行初始化的时候,是不会调用=重载的. // test.cpp : 定义控制台应用程序的入口点. // //#include "stdafx.h" #include ...

  7. BZOJ4538 HNOI2016网络(树链剖分+线段树+堆/整体二分+树上差分)

    某两个点间的请求只对不在这条路径上的询问有影响.那么容易想到每次修改除该路径上的所有点的答案.对每个点建个两个堆,其中一个用来删除,线段树维护即可.由于一条路径在树剖后的dfs序中是log个区间,所以 ...

  8. AC自动机-HDU3065-简单题

    http://acm.hdu.edu.cn/showproblem.php?pid=3065 需要记录匹配情况的AC自动机,没有清空一些数组导致wa了几发. /*------------------- ...

  9. BZOJ 5308 [ZJOI2018] Day2T2 胖 | 二分 ST表

    题目链接 LOJ 2529 BZOJ 5308 题解 这么简单的题 为什么考场上我完全想不清楚 = = 对于k个关键点中的每一个关键点\(a\),二分它能一度成为哪些点的最短路起点(显然这些点在一段包 ...

  10. 配置AD RMS及SharePoint 2013 IRM问题解决及相关资源

    最近配置AD RMS及SharePoint 2013 IRM遇到几个问题: 1. RMS配置好后,client端连不上, 一直要求输入用户名和密码. 后来换了台不是SP的机器,并用内部DB,搞定.   ...