zoukankan      html  css  js  c++  java
  • 接口隔离原则

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

    实现需求如下图:

    先看这张图所描述的:

    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();
    	}
    }
    
    
  • 相关阅读:
    完整安装IIS服务
    IIS支持json、geojson文件
    C# ODP.Net oracle数据库操作 支持不安装客户端
    RabbitMQ —— spring标签整合实现(API介绍)
    RabbitMQ —— spring标签整合实现
    RabbitMQ —— spring整合发送异步消息
    RabbitMQ —— spring整合发送同步消息
    RabbitMQ Spring 相关类信息
    RabbitMQ 消息流转示意图
    RabbitDemo —— 延迟队列(在消息上设置TTL)
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12517553.html
Copyright © 2011-2022 走看看