使用多个专门的接口比使用单一的总接口总要好

接口隔离原则是指使用多个专门的接口(抽象类也是接口), 而不使用单的总接口. 每一个接口应该承担一种相对独立的角色, 不多不少, 不干不该干的事, 该干的事都要干.

采用接口隔离原则对接口进行约束时,要注意以下几点:

  • 接口尽量小,但是要有限度. 对接口进行细化可以提高程序设计灵活性是不挣的事实, 但是如果过小, 则会造成接口数量过多, 使设计复杂化. 所以一定要适度.
  • 为依赖接口的类定制服务, 只暴露给调用的类它需要的方法, 它不需要的方法则隐藏起来. 只有专注地为一个模块提供定制服务, 才能建立最小的依赖关系.
  • 提高内聚, 减少对外交互. 使接口用最少的方法去完成最多的事情运用接口隔离原则, 一定要适度, 接口设计的过大或过小都不好. 设计接口的时候, 只有多花些时间去思考和筹划, 才能准确地实践这一原则.
// 接口隔离原则001
namespace 接口隔离原则001
{
    public interface Iinterface
    {
        void Method01();
        void Method02();
        void Method03();
        void Method04();
        void Method05();
    }

    class A
    {
        public void Depend1(Iinterface iinterface)
        {
            iinterface.Method01();
        }

        public void Depend2(Iinterface iinterface)
        {
            iinterface.Method02();
        }

        public void Depend3(Iinterface iinterface)
        {
            iinterface.Method03();
        }
    }

    class B : Iinterface
    {
        public void Method01()
        {
            Console.WriteLine("B实现接口Method01");
        }

        public void Method02()
        {
            Console.WriteLine("B实现接口Method02");
        }

        public void Method03()
        {
            Console.WriteLine("B实现接口Method03");
        }

        public void Method04()
        {
        }

        public void Method05()
        {
        }
    }

    public class C
    {
        public void Depend1(Iinterface iinterface)
        {
            iinterface.Method01();
        }

        public void Depend2(Iinterface iinterface)
        {
            iinterface.Method04();
        }

        public void Depend3(Iinterface iinterface)
        {
            iinterface.Method05();
        }
    }

    public class D : Iinterface
    {
        public void Method01()
        {
            Console.WriteLine("D实现接口Method01");
        }

        public void Method02()
        { }

        public void Method03()
        { }

        public void Method04()
        {
            Console.WriteLine("D实现接口Method04");
        }

        public void Method05()
        {
            Console.WriteLine("D实现接口Method05");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            a.Depend1(new B());
            a.Depend2(new B());
            a.Depend3(new B());

            C c = new C();
            c.Depend1(new D());
            c.Depend2(new D());
            c.Depend3(new D());
        }
    }
}
// 接口隔离原则002
namespace 接口隔离原则002
{
    public interface I1
    {
        void Method1();
    }

    public interface I2
    {
        void Method2();
        void Method3();
    }

    public interface I3
    {
        void Method4();
        void Method5();
    }

    class A
    {
        public void Depend1(I1 i1)
        {
            i1.Method1();
        }

        public void Depend2(I2 i)
        {
            i.Method2();
        }

        public void Depend3(I2 i)
        {
            i.Method3();
        }
    }

    class B : I1, I2
    {
        public void Method1()
        {
            Console.WriteLine("B实现接口I1的Method1");
        }

        public void Method2()
        {
            Console.WriteLine("B实现接口I2的Method2");
        }

        public void Method3()
        {
            Console.WriteLine("B实现接口I2的Method3");
        }
    }

    class C
    {
        public void Depend1(I1 i)
        {
            i.Method1();
        }

        public void Depend2(I3 i)
        {
            i.Method4();
        }

        public void Depend3(I3 i)
        {
            i.Method5();
        }
    }

    class D : I1, I3
    {
        public void Method1()
        {
            Console.WriteLine("D实现接口I2的Method1");
        }

        public void Method4()
        {
            Console.WriteLine("D实现接口I3的Method4");
        }

        public void Method5()
        {
            Console.WriteLine("D实现接口I3的Method5");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            a.Depend1(new B());
            a.Depend2(new B());
            a.Depend3(new B());

            C c = new C();
            c.Depend1(new D());
            c.Depend2(new D());
            c.Depend3(new D());
        }
    }
}

Q.E.D.