zoukankan      html  css  js  c++  java
  • java设计模式学习笔记--接口隔离原则

    接口隔离原则简述

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

    应用场景

    如下UML图

    类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类D,如果接口Interface1对于类A和类C来说不是最小接口,那么类B和类D必须去实现他们不需要实现的方法
    按照接口隔离原则,将接口Interface1拆分成若干个独立的接口(如图可得拆分成3个),类A和类C分别与他们需要的接口建立依赖关系

    应用实例

    没有使用接口隔离原则

    public class Segregation1 {
    	public static void main(String[] args) {
    		
    	}
    }
    
    //接口
    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("B实现了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{	//A类通过接口interface1 依赖(使用)D类,但是只会使用 1,4,5的方法
    	public void depend1(Interface1 i) {
    		i.operation1();
    	}
    	public void depend4(Interface1 i) {
    		i.operation4();
    	}
    	public void depend5(Interface1 i) {
    		i.operation5();
    	}
    }
    
    上面代码中类A依赖于类B时,不需要实现接口Interface1中的operation4()和operation5()的方法,类C依赖于类D时,不需要实现operation2()和operation3()的方法,此时Interface1不是类A和类C的最小接口

    使用接口隔离原则

    public class Segregation2 {
    	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.depend4(new D());
    		c.depend5(new D());
    	}
    }
    
    //接口1
    interface Interface1 {
    	void operation1();
    }
    //接口2
    interface Interface2 {
    	void operation2();
    	void operation3();
    }
    //接口3
    interface Interface3 {
    	void operation4();
    	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("B实现了operation5");
    	}
    }
    
    class A{	//A类通过接口interface1 依赖(使用)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{	//A类通过接口interface1 依赖(使用)D类,但是只会使用 1,4,53的方法
    	public void depend1(Interface1 i) {
    		i.operation1();
    	}
    	public void depend4(Interface3 i) {
    		i.operation4();
    	}
    	public void depend5(Interface3 i) {
    		i.operation5();
    	}
    }
    
    类A依赖类B实现operation1(),operation2()和operation3()方法,
    类C依赖类D实现operation1(),operation4()和operation5()方法。
    根据接口隔离原则,将原本的Interface1拆分成三个接口,其中
    新的接口Interface1中拥有operation1()方法,
    接口Interface2中拥有operation2()和operation3()方法,
    接口Interface3中拥有operation4()和operation5()方法。
    让类B继承接口Interface1和接口Interface2,
    让类D继承接口Interface1和接口Interface3。
    这样,就满足接口隔离原则了。

    具体关系如下UML图

    下一篇链接(java设计模式学习笔记--依赖倒转原则):

    https://www.cnblogs.com/windowsxpxp/p/11568009.html

  • 相关阅读:
    .NET XmlNavigator with Namespace
    编程要素
    【FOJ】1962 新击鼓传花游戏
    【POJ】1389 Area of Simple Polygons
    【POJ】2482 Stars in Your Window
    【HDU】3265 Posters
    【HDU】1199 Color the Ball
    【HDU】3642 Get The Treasury
    【HDU】4027 Can you answer these queries?
    【HDU】1542 Atlantis
  • 原文地址:https://www.cnblogs.com/windowsxpxp/p/11567743.html
Copyright © 2011-2022 走看看