zoukankan      html  css  js  c++  java
  • 设计模式六大原则(4):接口隔离原则

    接口隔离原则

    设计模式系列文章

    1、问题由来

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

    2、什么是接口隔离原则

      接口隔离原则比较简单,有两种定义:

    • Clients should not be forced to depend upon interfaces that they don't use.(客户端不应该强行依赖它不需要的接口)
    • The dependency of one class to another one should depend on the smallest possible interface.(类间的依赖关系应该建立在最小的接口上)

      其实上述两种定义说的是同一种意思。客户端不应该依赖它不需要的接口,意思就是说客户端只要依赖它需要的接口,它需要什么接口,就提供什么接口,不提供多余的接口。“类间的依赖关系应该建立在最小的接口上”也表达这一层意思。通俗的讲就是:接口中的方法应该尽量少,不要使接口过于臃肿,不要有很多不相关的逻辑方法。

      通过简单的代码还原开篇的问题,代码如下:

    public interface I {
    	public void method1();
    	public void method2();
    	public void method3();
    }
    public class B implements I{
    
    	@Override
    	public void method1() {
    		System.out.println("类B实现了接口I的方法1");
    	}
    
    	@Override
    	public void method2() {
    		System.out.println("类B实现了接口I的方法2");
    	}
    
    	@Override
    	public void method3() {//类B并不需要接口I的方法3功能,但是由于实现接口I,所以不得不实现方法3
    		//在这里写一个空方法
    	}
    }
    public class D implements I{
    
    	@Override
    	public void method2() {
    		System.out.println("类D实现了接口I的方法2");
    	}
    
    	@Override
    	public void method3() {
    		System.out.println("类D实现了接口I的方法3");
    	}
    
    	@Override
    	public void method1() {//类D并不需要接口I的方法1功能,但是由于实现接口I,所以不得不实现方法1
    		//在这里写一个空方法
    	}
    }
    //类A通过接口I依赖类B
    public class A {
    	public void depend1(I i){
    		i.method1();
    	}
    }
    //类C通过接口I依赖类D
    public class C {
    	public void depend1(I i){
    		i.method3();
    	}
    }
    public class Client {
    	public static void main(String[] args) {
    		A a = new A();
    		I i1 = new B();
    		a.depend1(i1);
    		
    		C c = new C();
    		I i2 = new D();
    		c.depend1(i2);
    	}
    }
    

      运行结果:

    类B实现了接口I的方法1
    类D实现了接口I的方法3

      从以上代码可以看出,如果接口过于臃肿,不同业务逻辑的抽象方法都放在一个接口内,则会造成它的实现类必须实现自己并不需要的方法,这种设计方式显然是不妥当的。所以我们要修改上述设计方法,把接口I拆分成3个接口,使得实现类只需要实现自己需要的接口即可。只贴出修改后的接口和实现类的代码,修改代码如下:

    public interface I1 {
    	public void method1();
    }
    public interface I2 {
    	public void method2();
    }
    public interface I3 {
    	public void method3();
    }
    
    public class B implements I1,I2{
    	@Override
    	public void method1() {
    		System.out.println("类B实现了接口I的方法1");
    	}
    
    	@Override
    	public void method2() {
    		System.out.println("类B实现了接口I的方法2");
    	}
    }
    
    public class D implements I2,I3{
    	@Override
    	public void method2() {
    		System.out.println("类D实现了接口I的方法2");
    	}
    
    	@Override
    	public void method3() {
    		System.out.println("类D实现了接口I的方法3");
    	}
    }
    

    3、与单一职责原则的区别

      到了这里,有些人可能觉得接口隔离原则与单一职责原则很相似,其实不然。

      第一,单一职责原则注重的是职责;而接口隔离原则注重对接口依赖的隔离。

      第二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口,主要针对抽象,针对程序整体框架的构建。

    4、注意事项

      原则是前人经验的总结,在软件设计中具有一定的指导作用,但是不能完全照搬这些原则。对于接口隔离原则来说,接口尽量小,但是也要有限度。对接口进行细化可以提高程序设计灵活性是不争的事实,但是如果过小,则会造成接口数量过多,使设计复杂化,所以一定要适度。

  • 相关阅读:
    宝塔面板连接数据库失败
    fastadmin上线部署中遇到访问路径问题
    宝塔部署时,出现“open_basedir restriction in effect”错误
    layui hint:upload is not a valid module
    thinkphp--控制器怎么分配变量到公共模板
    jquey click事件无效
    1.31 SVN代码版本控制
    8.1 性能优化简介
    5.31 Nginx最全面知识
    4.115 Spring的事务管理
  • 原文地址:https://www.cnblogs.com/hellojava/p/2982700.html
Copyright © 2011-2022 走看看