设计模式七大原则——接口隔离原则

摘要:
一、基本介绍  一个类对另一个类的依赖应该建立在最小的接口上二、应用实例  分析以上类图:  首先有四个类,分别是A,B,C,D,以及一个接口Interface1,其中有五个抽象方法,分别是operation1,operation2,operation3,operation4,operation5  类B和类D都会实现Interface1接口  类A通过Interface1接口依赖类B,但是类A中

一、基本介绍

  一个类对另一个类的依赖应该建立在最小的接口上

二、应用实例

  设计模式七大原则——接口隔离原则第1张

分析以上类图:

  首先有四个类,分别是A,B,C,D,以及一个接口Interface1,其中有五个抽象方法,分别是operation1,operation2,operation3,operation4,operation5

  类B和类D都会实现Interface1接口

  类A通过Interface1接口依赖类B,但是类A中只会使用到接口的operation1,operation2,operation3三个方法

  类C通过Interface1接口依赖类D,但是类C中只会使用到接口的operation1,operation4,operation5三个方法

  编写程序如下:

1 public classSegregation1 {
2     public static voidmain(String[] args) {
3         A a = newA();
4         //类A通过接口依赖类B
5         a.depend1(newB());
6         a.depend2(newB());
7         a.depend3(newB());
8 
9         C c = newC();
10         //类C通过接口依赖类D
11         c.depend1(newD());
12         c.depend4(newD());
13         c.depend5(newD());
14 }
15 }
16 
17 interfaceInterface1 {
18     voidoperation1();
19     voidoperation2();
20     voidoperation3();
21     voidoperation4();
22     voidoperation5();
23 }
24 
25 class B implementsInterface1 {
26 @Override
27     public voidoperation1() {
28         System.out.println("B中实现了operation1");
29 }
30 @Override
31     public voidoperation2() {
32         System.out.println("B中实现了operation2");
33 }
34 @Override
35     public voidoperation3() {
36         System.out.println("B中实现了operation3");
37 }
38 @Override
39     public voidoperation4() {
40         System.out.println("B中实现了operation4");
41 }
42 @Override
43     public voidoperation5() {
44         System.out.println("B中实现了operation5");
45 }
46 }
47 
48 class D implementsInterface1 {
49 @Override
50     public voidoperation1() {
51         System.out.println("D中实现了operation1");
52 }
53 @Override
54     public voidoperation2() {
55         System.out.println("D中实现了operation2");
56 }
57 @Override
58     public voidoperation3() {
59         System.out.println("D中实现了operation3");
60 }
61 @Override
62     public voidoperation4() {
63         System.out.println("D中实现了operation4");
64 }
65 @Override
66     public voidoperation5() {
67         System.out.println("D中实现了operation5");
68 }
69 }
70 
71 //类A通过接口Interface1依赖类B,但是只会用到1,2,3方法
72 classA {
73     public voiddepend1(Interface1 interface1) {
74 interface1.operation1();
75 }
76     public voiddepend2(Interface1 interface1) {
77 interface1.operation2();
78 }
79     public voiddepend3(Interface1 interface1) {
80 interface1.operation3();
81 }
82 }
83 
84 //类C通过接口Interface1依赖类B,但是只会用到1,4,5方法
85 classC {
86     public voiddepend1(Interface1 interface1) {
87 interface1.operation1();
88 }
89     public voiddepend4(Interface1 interface1) {
90 interface1.operation4();
91 }
92     public voiddepend5(Interface1 interface1) {
93 interface1.operation5();
94 }
95 }

  输出结果:

  设计模式七大原则——接口隔离原则第2张

类A和类C都通过Interface1接口分别依赖类B和类D

  但是由于类A和类C只需要使用Interface1接口中的部分方法,造成了类B和类D中方法的冗余

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

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

  3. 接口Interface1中出现的方法,根据实际情况拆分为三个接口

  解决方案:将Interface1接口的粒度进一步细化,分解为Interface1,Interface2,Interface3三个接口

  设计模式七大原则——接口隔离原则第3张

  代码实现:

1 public classSegregation1 {
2     public static voidmain(String[] args) {
3         A a = newA();
4         //类A通过接口依赖类B
5         a.depend1(newB());
6         a.depend2(newB());
7         a.depend3(newB());
8 
9         C c = newC();
10         //类C通过接口依赖类D
11         c.depend1(newD());
12         c.depend4(newD());
13         c.depend5(newD());
14 }
15 }
16 
17 interfaceInterface1 {
18     voidoperation1();
19 }
20 
21 interfaceInterface2 {
22     voidoperation2();
23 
24     voidoperation3();
25 }
26 
27 interfaceInterface3 {
28     voidoperation4();
29 
30     voidoperation5();
31 }
32 
33 class B implementsInterface1, Interface2 {
34 @Override
35     public voidoperation1() {
36         System.out.println("B中实现了operation1");
37 }
38 
39 @Override
40     public voidoperation2() {
41         System.out.println("B中实现了operation2");
42 }
43 
44 @Override
45     public voidoperation3() {
46         System.out.println("B中实现了operation3");
47 }
48 }
49 
50 class D implementsInterface1, Interface3 {
51 @Override
52     public voidoperation1() {
53         System.out.println("D中实现了operation1");
54 }
55 
56 @Override
57     public voidoperation4() {
58         System.out.println("D中实现了operation4");
59 }
60 
61 @Override
62     public voidoperation5() {
63         System.out.println("D中实现了operation5");
64 }
65 }
66 
67 //类A通过接口Interface1,2依赖类B
68 classA {
69     public voiddepend1(Interface1 interface1) {
70 interface1.operation1();
71 }
72 
73     public voiddepend2(Interface2 interface2) {
74 interface2.operation2();
75 }
76 
77     public voiddepend3(Interface2 interface2) {
78 interface2.operation3();
79 }
80 }
81 
82 //类C通过接口Interface1,3依赖类B
83 classC {
84     public voiddepend1(Interface1 interface1) {
85 interface1.operation1();
86 }
87 
88     public voiddepend4(Interface3 interface3) {
89 interface3.operation4();
90 }
91 
92     public voiddepend5(Interface3 interface3) {
93 interface3.operation5();
94 }
95 }

输出结果:

  设计模式七大原则——接口隔离原则第4张

与实现接口隔离原则之前的输出结果相同,但是在接口的粒度上进行了细化,降低了代码的耦合度

免责声明:文章转载自《设计模式七大原则——接口隔离原则》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ruby+seleniumwebdriver一步一步进行自动化测试(3)——面向对象编程[转]Magento 2中文文档教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

golang gin框架使用swagger生成接口文档

前言 一份清晰明了的接口文档能够极大地提高前后端双方的沟通效率和开发效率。 本文将介绍如何使用swagger生成接口文档。 swagger介绍 Swagger本质上是一种用于描述使用JSON表示的RESTful API的接口描述语言。Swagger与一组开源软件工具一起使用,以设计、构建、记录和使用RESTful Web服务。Swagger包括自动文档,代...

【网络开发】组播各种参数的设置及其意义

D类IP地址(224.0.0.0到239.255.255.255)不识别互联网内的单个接口,但识别接口组,被称为多播组。 单个网络上的组成员利用IGMP协议在系统之间通信。多播路由器用多播选录协议,如DVMRP(distance vector multicast  routing protocol,距离向量多播路由选择协议)传播成员信息。 在N...

020-Spring Boot 监控和度量

一、概述   通过配置使用actuator查看监控和度量信息 二、使用 2.1、建立web项目,增加pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g...

黑马程序员——JAVA学习笔记八(集合)

1,    JAVA最初版本只为最常用的数据结构提供了很少的一组类:Vector、Stack、Hashtable、BitSet与Enumeration接口,从JAVA1.2版本开始推出了一组功能完善的的数据结构。 集合类的由来:  对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定。  就使用集合容器进行存储。 集合特点: 1,用于存储对象的容器...

支付宝异步通知处理实现原理总结

支付宝有一个接口:实现支付请求(里面要提供一个订单号) 你有一个接口:实现支付结果的通知(通知里面会包含订单号) 后面就简单了 1)你生成订单 请求调用 支付宝接口 去支付(然后。。然后就没然后了) 2)你的接口:等着呗 支付宝会调用的接口 通知你 那个订单完成的结果 3) 支付系统的异步通知实质上是给给定的地址发送请求实现的,这个地址很可能是不会有页面而...

接口与委托

在接口中可以声明方法、属性、索引指示器和事件,接口中并不提供它们的实现。因此接口是函数成员声明的集合。如果类或结构从一个接口派生,则这个类或结构负责实现该接口中所声明的所有函数成员。一个接口可以继承多个接口,而一个类或结构可以实现多个接口。由于C#语言不支持多继承,因此,如果某个类需要继承多个类的行为时,只能使用多个接口加以说明。 委托类型,在功能上它类...