美文网首页程序员
设计模式系列(二)七大设计原则-----接口隔离原则

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

作者: 上古神龙 | 来源:发表于2020-10-12 10:24 被阅读0次

    接口隔离原则

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

    案例

    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(); 
        } 
    }
    

    相关文章

      网友评论

        本文标题:设计模式系列(二)七大设计原则-----接口隔离原则

        本文链接:https://www.haomeiwen.com/subject/gfjupktx.html