ZT 设计模式六大原则(4):接口隔离原则
设计模式六大原则(4):接口隔离原则
问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。
解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。
举例来说明接口隔离原则:
(图1 未遵循接口隔离原则的设计)
这个图的意思是:类A依赖接口I中的方法1、方法2、方法3,类B是对类A依赖的实现。类C依赖接口I中的方法1、方法4、方法5,类D是对类C依赖的实 现。对于类B和类D来说,虽然他们都存在着用不到的方法(也就是图中红色字体标记的方法),但由于实现了接口I,所以也必须要实现这些用不到的方法。对类 图不熟悉的可以参照程序代码来理解,代码如下:
- interface I {
- public void method1();
- public void method2();
- public void method3();
- public void method4();
- public void method5();
- }
- class A{
- public void depend1(I i){
- i.method1();
- }
- public void depend2(I i){
- i.method2();
- }
- public void depend3(I i){
- i.method3();
- }
- }
- class B implements I{
- public void method1() {
- System.out.println("类B实现接口I的方法1");
- }
- public void method2() {
- System.out.println("类B实现接口I的方法2");
- }
- public void method3() {
- System.out.println("类B实现接口I的方法3");
- }
- //对于类B来说,method4和method5不是必需的,但是由于接口A中有这两个方法,
- //所以在实现过程中即使这两个方法的方法体为空,也要将这两个没有作用的方法进行实现。
- public void method4() {}
- public void method5() {}
- }
- class C{
- public void depend1(I i){
- i.method1();
- }
- public void depend2(I i){
- i.method4();
- }
- public void depend3(I i){
- i.method5();
- }
- }
- class D implements I{
- public void method1() {
- System.out.println("类D实现接口I的方法1");
- }
- //对于类D来说,method2和method3不是必需的,但是由于接口A中有这两个方法,
- //所以在实现过程中即使这两个方法的方法体为空,也要将这两个没有作用的方法进行实现。
- public void method2() {}
- public void method3() {}
- public void method4() {
- System.out.println("类D实现接口I的方法4");
- }
- public void method5() {
- System.out.println("类D实现接口I的方法5");
- }
- }
- public class Client{
- public static void main(String[] args){
- A a = new A();
- a.depend1(new B());
- a.depend2(new B());
- a.depend3(new B());
- C c = new C();
- c.depend1(new D());
- c.depend2(new D());
- c.depend3(new D());
- }
- }
可以看到,如果接口过于臃肿,只要接口中出现的方法,不管对依赖于它的类有没有用处,实现类中都必须去实现这些方法,这显然不是好的设计。如果将这个设计 修改为符合接口隔离原则,就必须对接口I进行拆分。在这里我们将原有的接口I拆分为三个接口,拆分后的设计如图2所示:
(图2 遵循接口隔离原则的设计)
照例贴出程序的代码,供不熟悉类图的朋友参考:
- interface I1 {
- public void method1();
- }
- interface I2 {
- public void method2();
- public void method3();
- }
- interface I3 {
- public void method4();
- public void method5();
- }
- class A{
- public void depend1(I1 i){
- i.method1();
- }
- public void depend2(I2 i){
- i.method2();
- }
- public void depend3(I2 i){
- i.method3();
- }
- }
- class B implements I1, I2{
- public void method1() {
- System.out.println("类B实现接口I1的方法1");
- }
- public void method2() {
- System.out.println("类B实现接口I2的方法2");
- }
- public void method3() {
- System.out.println("类B实现接口I2的方法3");
- }
- }
- class C{
- public void depend1(I1 i){
- i.method1();
- }
- public void depend2(I3 i){
- i.method4();
- }
- public void depend3(I3 i){
- i.method5();
- }
- }
- class D implements I1, I3{
- public void method1() {
- System.out.println("类D实现接口I1的方法1");
- }
- public void method4() {
- System.out.println("类D实现接口I3的方法4");
- }
- public void method5() {
- System.out.println("类D实现接口I3的方法5");
- }
- }
接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图
去建立一个很庞大的接口供所有依赖它的类去调用。本文例子中,将一个庞大的接口变更为3个专用的接口所采用的就是接口隔离原则。在程序设计中,依赖几个专
用的接口要比依赖一个综合的接口更灵活。接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护
性。
说到这里,很多人会觉的接口隔离原则跟之前的单一职责原则很相似,其实不然。其一,单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离。其
二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的
构建。
采用接口隔离原则对接口进行约束时,要注意以下几点:
- 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
- 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
- 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
运用接口隔离原则,一定要适度,接口设计的过大或过小都不好。设计接口的时候,只有多花些时间去思考和筹划,才能准确地实践这一原则。
更多
ZT 设计模式六大原则(4):接口隔离原则的更多相关文章
- [设计模式]<<设计模式之禅>>关于接口隔离原则
在讲接口隔离原则之前,先明确一下我们的主角——接口.接口分为两种: ● 实例接口(Object Interface),在Java中声明一个类,然后用new关键字产生一个实例,它是对一个类型的事物的描述 ...
- 面向对象的六大原则之 接口隔离原则——ISP
ISP = Interface Segregation Principle ISP的定义如下: 1.客户端不应该依赖他不需要的接口 2.一个类对另外一个类的依赖性应该是建立在最小的接口上 3.不应 ...
- 设计原则:接口隔离原则(ISP)
接口隔离原则的英文是Interface Segregation Principle,缩写就是ISP.与里氏替换原则一样其定义同样有两种 定义1: Clients should not be force ...
- IOS设计模式的六大设计原则之接口隔离原则(ISP,Interface Segregation Principle)
定义 客户端不应该依赖它不需要的接口: 一个类对另一个类的依赖应该建立在最小的接口上. 定义解读 定义包含三层含义: 一个类对另一个类的依赖应该建立在最小的接口上: 一个接口代表一个角色,不应该将不同 ...
- 设计模式 第一天 UML图,设计模式原则:开闭原则、依赖倒转原则、接口隔离原则、合成复用原则、迪米特法则,简单工厂模式
1 课程大纲 2 UML的概述 总结: UML unified model language 统一建模语言 一共有十种图: 类图 用例图 时序图 * 对象图 包图 组件图 部署图 协作图 状态图 (最 ...
- 设计模式课程 设计模式精讲 3-7 接口隔离原则讲解及Coding
1 主讲内容 1.1 核心内容 1.2 优点 1.3 课程记录 2 代码演练 2.1 接口隔离原则反比 2.2 接口隔离原则正比 1 主讲内容 1.1 核心内容 总结:细粒度可以进行再组装,粗粒度不可 ...
- Java设计模式(3:接口隔离原则和迪米特法则详解)
一.接口隔离原则 使用多个接口,而不使用单一的接口,客户端不应该依赖它不需要的接口.尽量的细化接口的职责,降低类的耦合度. 我们先来看一个例子: 小明家附近新开了一家动物园,里面有老虎.鸟儿.长颈鹿. ...
- 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(The Interface Segregation Principle). 英文原文:htt ...
- 最简单直接地理解Java软件设计原则之接口隔离原则
理论性知识 定义 接口隔离原则, Interface Segregation Principle,(ISP). 一个类对应一个类的依赖应该建立在最小的接口上: 建立单一接口,不要建立庞大臃肿的接口: ...
- 设计模式学习--面向对象的5条设计原则之接口隔离原则--ISP
一.ISP简介(ISP--Interface Segregation Principle): 使用多个专门的接口比使用单一的总接口要好.一个类对另外一个类的依赖性应当是建立在最小的接口上的.一个接口代 ...
随机推荐
- ubuntu系统之难
声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...
- Git命令学习笔记
一.本地代码增,删,改,查,提交,找回git checkout . //抛弃工作区所有修改git checkout -- <file> //抛弃工作区& ...
- C#操作Redis SortedSet 有序集合
/// <summary> /// Redis 有序集合 /// </summary> public static void Redis_SetSorted() { Redis ...
- centos 中输入ifconfig 只有lo 没有eth0
问题描述:linux中输入ifconfig命令,只有lo,没有eth0 解决方法: 1.进入/etc/sysconfig/network-scripts 目录,发现有ifcfg-eth0,即网卡(驱动 ...
- Firebird3 embedded connection
Firebird3 的嵌入式连接和以前的版本不同,官方也不再单独发布嵌入式版本了,因为嵌入式版本已经包含在zip包里了. 具体只需要文件: fbclient.dll.ib_util.dll.icudt ...
- [转]Install ASP.NET MVC 4 for Visual Studio 2010
本文转自:https://docs.microsoft.com/en-us/aspnet/mvc/mvc4
- Ajax知识点复习
1. ajax是什么? * asynchronous javascript and xml:异步的js和xml * 它能使用js访问服务器,而且是异步访问! * 服务器给客户端的响应一般是整个页面,一 ...
- 微信小程序整理
目录 开发环境 目录结构 WXML组件 WXSS 数据绑定 条件渲染 列表渲染 模版 事件 引用 路由传参 API 实例TodoList 1.开发环境 开发工具下载(https://mp.weixin ...
- Redis整合spring总结
一:Redis简介: Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理. 简单来说,它是一个以(key,value)的形式存储数据的数据库. 官网:https://re ...
- 1、springboot之HelloWorld
最基本的,官网copy 创建maven项目 maven中添加 <parent> <groupId>org.springframework.boot</groupId> ...