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


    接口隔离原则

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

    案例

    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(); 
    	} 
    }
    
  • 相关阅读:
    利用 Avisynth 2.5.8 的 ColorKeyMask 功能实现视频抠像
    Codebook model 视频抠像 xp sp3 + vs2005 + OpenCV 2.3.1
    call、apply、bind
    网络模型
    搜索关键字变色突出显示
    面向过程与面向对象编程的区别和优缺点
    webpack打包体积优化---插件 webpack-bundle-analyzer
    百度搜索关键词特效
    DNS原理及其解析过程
    亿级高并发数据库调优与最佳实践法则
  • 原文地址:https://www.cnblogs.com/shanggushenlong/p/13801289.html
Copyright © 2020-2023  润新知