设计模式系列(二)七大设计原则-----接口隔离原则

接口隔离原则

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

案例

  1. 案例uml图
    uml类图
  • 如上的uml图, 类 A 通过接口 Interface1 依赖类 B,类 C 通过接口 Interface1 依赖类 D,如果接口 Interface1 对于类 A 和类 C 来说不是最小接口,那么类 B 和类 D 必须去实现他们不需要的方法
  • 按照接口隔离原则应该这样处理:将接口 Interface1 拆分成 独立的接口,类A与类C分别与它们需要的接口建立依赖关系。也就是采用接口隔离原则

应用实例

  1. 按照上面的UML类图实现此代码
package com.atguigu.principle.segregation;
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 voido peration3(){ 
		System.out.println("D 实现了 operation3"); 
	} 
	public void operation4(){ 
		System.out.println("D 实现了 operation4");
	 } 
	public void operation5(){ 
		System.out.println("D 实现了 operation5");
    }
}

//A 类通过接口 Interface1 依赖(使用)B 类,但是只会用到 1,2,3 方法 
classA{
	public void depend1(Interface1 i){ 
		i.operation1(); 
	} 
	public void depend2(Interface1 i){
	 i.operation2(); 
	} 
	 public void depend3(Interface1 i){ 
	 i.operation3();
	 }
}

//C 类通过接口 Interface1 依赖(使用)D 类,但是只会用到 1,4,5 方法 
classC{
	public void depend1(Interface1 i){ 
		i.operation1();
    } 
	public void depend4(Interface1 i){ 
		i.operation4(); 
	} 
	public void depend5(Interface1 i){ 
		i.operation5(); 
	} 
}
  1. 情况描述:
  • A类通过接口 Interface1 依赖(使用)B类,但是实际上只是用到1,2,3方法
  • B类通过接口 Interface2 依赖(使用)D 类,但是只会用到 1,4,5 方法
    注:综上,两个实现类实现同一个接口,但是却并不会用到接口里面的所有方法,违法接口隔离原则

改进

  • 类 A 通过接口 Interface1 依赖类 B,类 C 通过接口 Interface1 依赖类 D,如果接口 Interface1 对于类 A 和类 C 来说不是最小接口,那么类 B 和类 D 必须去实现他们不需要的方法
  • 将接口 Interface1 拆分为独立的几个接口,类 A 和类 C 分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则
  • 接口 Interface1 中出现的方法,根据实际情况拆分为三个接口,如下新UML所示
    在这里插入图片描述
  1. 代码实现
package com.atguigu.principle.segregation.improve;
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());
	}
}

// 接口 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("D 实现了 operation5");
    }
}

//A 类通过接口 Interface1 依赖(使用)B 类,但是只会用到 1,2,3 方法 
classA{
	public void depend1(Interface1 i){ 
		i.operation1(); 
	} 
	public void depend2(Interface2 i){
	 i.operation2(); 
	} 
	 public void depend3(Interface2 i){ 
	 i.operation3();
	 }
}

//C 类通过接口 Interface1 依赖(使用)D 类,但是只会用到 1,4,5 方法 
classC{
	public void depend1(Interface1 i){ 
		i.operation1();
    } 
	public void depend4(Interface3 i){ 
		i.operation4(); 
	} 
	public void depend5(Interface3 i){ 
		i.operation5(); 
	} 
}
posted @ 2020-10-12 10:29  上古神龙  阅读(90)  评论(0编辑  收藏  举报