0x02、设计模式原则 —— 接口隔离原则

概念

客户端不应该依赖它不需要的接口,即:一个类对另一个类的依赖应该建立在最小的接口上;(比较难理解这句话,但不要紧,请继续看下面)

 

演示

看下图,Inerface1接口中有5个抽象方法,其中,B和D为 抽象接口Interface1 的 实现类,A和C依赖于抽象接口 Interface1:

上图中,假设:类A 只用抽象类中的1、2、3三个方法,而4、5这两个方法类A是不需要的,而B类只用抽象接口中的1、4、5三个方法,同样2、3这两个方法类B是不需要的,我们就说,客户端A和C都有依赖了它们不需要的接口;违反了 接口隔离原则!

上图中的代码的实现:

interface Interface1
{
    void operation1();
    void operation2();
    void operation3();
    void operation4();
    void operation5();

}

public class B : Interface1
{
    public void operation1()
    {
        Console.WriteLine("实现类B中的func1方法");
    }

    public void operation2()
    {
        Console.WriteLine("实现类B中的func2方法");
    }

    public void operation3()
    {
        Console.WriteLine("实现类B中的func3方法");
    }

    public void operation4()
    {
        Console.WriteLine("实现类B中的func4方法");
    }

    public void operation5()
    {
        Console.WriteLine("实现类B中的func5方法");
    }
}

public class D : Interface1
{
    public void operation1()
    {
        Console.WriteLine("实现类D中的func1方法");
    }

    public void operation2()
    {
        Console.WriteLine("实现类D中的func2方法");
    }

    public void operation3()
    {
        Console.WriteLine("实现类D中的func3方法");
    }

    public void operation4()
    {
        Console.WriteLine("实现类D中的func4方法");
    }

    public void operation5()
    {
        Console.WriteLine("实现类D中的func5方法");
    }
}

class A
{
    // 类 A 中,通过接口 Interface1 依赖(使用)类B,但是只会用到 1、2、3 这两个方法
    public void depend1(Interface1 interf)
    {
        interf.operation1();
    }

    public void depend2(Interface1 interf)
    {
        interf.operation2();
    }
    public void depend3(Interface1 interf)
    {
        interf.operation3();
    }
}


class C
{
    // 类 C 中,通过接口 Interface1 依赖(使用)类D,但是只会用到 1、4、5 这三个方法
    public void depend1(Interface1 interf)
    {
        interf.operation1();
    }

    public void depend4(Interface1 interf)
    {
        interf.operation4();
    }
    public void depend5(Interface1 interf)
    {
        interf.operation5();
    }
}

上面代码中,类B 实现了接口中5个方法,而 类D 也实现了接口中的5个方法,但是 类A 中,我们并没有用到 operation4 和 operation5 这两个方法,同样的,类C 中页没有用到 operation2 和 operation3 这两个方法,既然没用到,那实现类不是白写了?

总结:上面代码中,类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类D,如果接口Interface1对于类A和类C来说不是最小接口,那么类B和类D必须去实现他们不需要的方法

按隔离原则应当这样处理:将接口Interface1拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则!

 

改进:接口Interface1中出现的方法,根据实际情况拆分为三个接口:

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

interface Interface1
{
    void operation1();
}
interface Interface2
{
    void operation2();
    void operation3();

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

public class B : Interface1,Interface2
{
    public void operation1()
    {
        Console.WriteLine("实现类B中的 operation1 方法");
    }

    public void operation2()
    {
        Console.WriteLine("实现类B中的 operation2 方法");
    }

    public void operation3()
    {
        Console.WriteLine("实现类B中的 operation3 方法");
    }
}

public class D : Interface1, Interface3
{

    public void operation1()
    {
        Console.WriteLine("实现类D中的 operation1 方法");
    }

    public void operation4()
    {
        Console.WriteLine("实现类D中的 operation4 方法");
    }

    public void operation5()
    {
        Console.WriteLine("实现类D中的 operation5 方法");
    }
}

class A
{
    // 类A 通过接口 Interfacel,Interface2 依赖(使用)类B,但是只会用到1,2,3方法
    public void depend1(Interface1 interf)
    {
        interf.operation1();
    }

    public void depend2(Interface2 interf)
    {
        interf.operation2();
    }

    public void depend3(Interface2 interf)
    {
        interf.operation3();
    }
}


class C
{
    // 类C 通过接口 Interfacel,Interface3 依赖(使用)类B,但是只会用到1、4、5方法
    public void depend1(Interface1 interf)
    {
        interf.operation1();
    }

    public void depend4(Interface3 interf)
    {
        interf.operation4();
    }
    public void depend5(Interface3 interf)
    {
        interf.operation5();
    }
}

 说白了就是:一个类依赖的接口中有我不需要的方法,那么我们需要将这个接口拆分成两个或多个接口,这样,拆分成多个接口之间就相当于隔离了,这就叫 接口隔离  ,我们依赖的才分后的接口就是最小了,这就叫:一个类对另一个类的依赖应该建立在最小的接口上;

即:我们依赖的接口中如果有用不到的成员,我们就将这个接口隔离,方式就是:拆,拆成我需要的接口,这种接口就是最小的;

 

这章其实不算难,如果有不懂的,欢迎评论区评论,我将会适度修改上面文章让大家都能大白话的理解它;

 

下一章,我们将继续深入:依赖倒置(倒转)原则

posted @ 2022-04-01 21:46  醉马踏千秋  阅读(87)  评论(0编辑  收藏  举报