示例解析java设计模式七大原则接口隔离原则及优化

网友投稿 263 2022-08-29


示例解析java设计模式七大原则接口隔离原则及优化

目录1.什么是接口隔离原则?2.对应代码3.改进代码4.接口隔离原则总结

1.什么是接口隔离原则?

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

2.对应代码

上面这张图呢,就违反了接口隔离原则。它对应的代码如下:

package com.szh.principle.segregation;

/**

*

*/

interface Interface1 {

void operation1();

void operation2();

void operation3();

void operation4();

void operation5();

}

class B implements Interface1 {

public void operation1() {

System.out.println("B 实现了 operation1");

}

public void operation2() {

System.out.println("B 实现了 operation2");

}

public void operation3() {

System.out.println("B 实现了 operation3");

}

public void operation4() {

System.out.println("B 实现了 operation4");

}

public void operation5() {

System.out.println("B 实现了 operation5");

}

}

class D implements Interface1 {

public void operation1() {

System.out.println("D 实现了 operation1");

}

public void operation2() {

System.out.println("D 实现了 operation2");

}

public void operation3() {

System.out.println("D 实现了 operation3");

}

public void operation4() {

System.out.println("D 实现了 operation4");

}

public void operation5() {

System.out.println("D 实现了 operation5");

}

}

class A { //A 类通过接口Interface1 依赖(使用) B类,但是只会用到1,2,3方法

public void depend1(Interface1 i) {

i.operation1();

}

public void depend2(Interface1 i) {

i.operation2();

}

public void depend3(Interface1 i) {

i.operation3();

}

}

class C { //C 类通过接口Interface1 依赖(使用) D类,但是只hVXmw会用到1,4,5方法

public void depend1(Interface1 i) {

i.operation1();

}

public void depend4(Interface1 i) {

i.operation4();

}

public void depend5(Interface1 i) {

i.operation5();

}

}

public class Segregation1 {

public static void main(String[] args) {

A a = new A();

a.depend1(new B()); // A类通过接口去依赖B类

a.depend2(new B());

a.depend3(new B());

C c = new C();

c.depend1(new D()); // C类通过接口去依赖(使用)D类

c.depend4(new D());

c.depend5(new D());

}

}

代码虽然很长,但是不难理解。A类依赖了B类,但是只会用到顶级接口中的1、2、3这三个方法;而C类依赖了D类,但是只会用到顶级接口中的1、4、5这三个方法,也就是说在A和B这两个类的层面上而言,和顶级接口中的4、5两个方法是没什么关联的,那么B类在实现顶级接口的时候就没必要重写4、5这两个方法了。但是这里有一个问题就是顶级接口中包括了1到5这五个方法,你如果实现这个接口就必须重写这五个方法,那么我们就可以考虑将顶级接口拆分成多个接口,需要用到哪个就实现哪个,这也就是所谓的接口隔离了。

3.改进代码

经过上面的一番叙述,我们可以将代码改写成下面的形式。

即将顶级接口拆分成3个小接口,B、D两个类根据实际情况该实现哪个接口就实现哪个接口(因为这五个方法已经被分开了)。

package com.szh.principle.segregation.improve;

/**

*

*/

interface Interface1 {

void operation1();

}

interface Interface2 {

void operation2();

void operation3();

}

interface Interface3 {

void operation4();

http:// void operation5();

}

class B implements Interface1, Interface2 {

public void operation1() {

System.out.println("B 实现了 operation1");

}

public void operation2() {

System.out.println("B 实现了 operation2");

}

public void operation3() {

System.out.println("B 实现了 operation3");

}

}

class D implements Interface1, Interface3 {

public void operation1() {

System.out.println("D 实现了 operation1");

}

public void operation4() {

System.out.println("D 实现了 operation4");

}

public void operation5() {

System.out.println("D 实现了 operation5");

}

}

class A { // A 类通过接口Interface1,Interface2 依赖(使用) B类,但是只会用到1,2,3方法

public void depend1(Interface1 i) {

i.operation1();

}

public void depend2(Interface2 i) {

i.operation2();

}

public void depend3(Interface2 i) {

i.operation3();

}

}

class C { // C 类通过接口Interface1,Interface3 依赖(使用) D类,但是只会用到1,4,5方法

public void depend1(Interface1 i) {

i.operation1();

}

public void depend4(Interface3 i) {

i.operation4();

}

public void depend5(Interface3 i) {

i.operation5();

}

}

public class Segregation2 {

public static void main(String[] args) {

A a = new A();

a.depend1(new B()); // A类通过接口去依赖B类

a.depend2(new B());

a.depend3(new B());

C c = new C();

c.depend1(new D()); // C类通过接口去依赖(使用)D类

c.depend4(new D());

c.depend5(new D());

}

}

4.接口隔离原则总结

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

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

以上就是示例分析java设计模式七大原则之接口隔离原则的详细内容,更多关于java设计模式接口隔离原则的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用dockerfile封装django镜像(dockerfile from基础镜像的来源)
下一篇:django学习第九天---raw查询原生sql和python脚本中调用django环境和ORM锁和事务
相关文章

 发表评论

暂时没有评论,来抢沙发吧~