接口隔离原则

接口隔离原则的体现:一个类对另一个类的依赖应该建立在最小的接口

实现需求如下图:

先看这张图所描述的:

B类 和 D类实现了该 接口Interface1 中的 五个方法

然后 A类 只需要使用该 接口Interface1 中的 1、2、3的方法

而 C类 只需要使用该 接口Interface1 中的 1、4、3的方法

来看下错误的代码: 会发现这样很多余,本身是不需要去使用的,但是还是将自己与它联系在了一起

Interface1接口的定义:

public interface Interface1 {
	void operation1();
	void operation2();
	void operation3();
	void operation4();
	void operation5();
}
public class demo1 {

	public static void main(String[] args) {
		B b = new B();
		D d = new D();
		
		A a = new A();
		C c = new C();
		a.depend1(b);
		a.depend2(b);
		a.depend3(b);
		
		c.depend1(d);
		c.depend2(d);
		c.depend3(d);

	}

}

class B implements Interface1{

	@Override
	public void operation1() {
		System.out.println("我是operation1 !!!");
	}

	@Override
	public void operation2() {
		System.out.println("我是operation2 !!!");
		
	}

	@Override
	public void operation3() {
		System.out.println("我是operation3 !!!");
		
	}

	@Override
	public void operation4() {
		System.out.println("我是operation4 !!!");
		
	}

	@Override
	public void operation5() {
		System.out.println("我是operation5 !!!");
		
	}
	
}

class D implements Interface1{
	@Override
	public void operation1() {
		System.out.println("我是operation1 !!!");
	}

	@Override
	public void operation2() {
		System.out.println("我是operation2 !!!");
		
	}

	@Override
	public void operation3() {
		System.out.println("我是operation3 !!!");
		
	}

	@Override
	public void operation4() {
		System.out.println("我是operation4 !!!");
		
	}

	@Override
	public void operation5() {
		System.out.println("我是operation5 !!!");
		
	}
}

class A{
	public void depend1(Interface1 i) {
		i.operation1();
	}
	
	public void depend2(Interface1 i) {
		i.operation2();
	}
	
	public void depend3(Interface1 i) {
		i.operation3();
	}
}

class C{
	public void depend1(Interface1 i) {
		i.operation1();
	}
	
	public void depend2(Interface1 i) {
		i.operation4();
	}
	
	public void depend3(Interface1 i) {
		i.operation5();
	}
}


上面的代码中我们需要让 A类 和 C类实现,但不是建立在 最小的接口上的,如果我们不是建立在最小的接口上,那么这两个类还要额外去联系这两个不需要用到的方法,这样会很多余!

解决方法:两个事项

1、将接口 Interface1 拆分为 独立的几个接口( 这里我们拆分成 3 个接口),类 A 和类 C 分别与他们需要的接口建立依赖关系,实现如下图所示,这也就是采用接口隔离原则

2、类 A 通过接口 Interface1 依赖类 B,类 C 通过接口 Interface1 依赖类 D,如果接口 Interface1 对于类 A 和类 C来说不是最小接口,那么类 B 和类 D 必须去实现他们不需要的方法,那么在这里就要去实现另外两个用来实现隔离效果的接口

那么这里就需要拆解成三个接口来进行实现,其中两个接口来为A类和C类来进行接口隔离的实现

Interface1接口的定义:

public interface Interface1 {
	void operation1();
}

Interface2接口的定义:

public interface Interface2 {
	void operation2();
	void operation3();
}

Interface3接口的定义:

public interface Interface3 {
	void operation4();
	void operation5();
}

代码如下:

public class demo2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		B b = new B();
		D d = new D();
		
		A a = new A();
		C c = new C();
		a.depend1(b);
		a.depend2(b);
		a.depend3(b);
		
		c.depend1(d);
		c.depend2(d);
		c.depend3(d);
	}

}


class B implements Interface1,Interface2{

	@Override
	public void operation1() {
		System.out.println("我是operation1 !!!");
	}

	@Override
	public void operation2() {
		System.out.println("我是operation2 !!!");
		
	}

	@Override
	public void operation3() {
		System.out.println("我是operation3 !!!");
		
	}

	
}

class D implements Interface1,Interface3{
	@Override
	public void operation1() {
		System.out.println("我是operation1 !!!");
	}

	@Override
	public void operation4() {
		System.out.println("我是operation4 !!!");
		
	}

	@Override
	public void operation5() {
		System.out.println("我是operation5 !!!");
		
	}
}

class A{
	public void depend1(Interface1 i) {
		i.operation1();
	}
	
	public void depend2(Interface2 i) {
		i.operation2();
	}
	
	public void depend3(Interface2 i) {
		i.operation3();
	}
}
class C{
	public void depend1(Interface1 i) {
		i.operation1();
	}
	
	public void depend2(Interface3 i) {
		i.operation4();
	}
	
	public void depend3(Interface3 i) {
		i.operation5();
	}
}

posted @ 2020-03-18 15:16  zpchcbd  阅读(215)  评论(0编辑  收藏  举报