【设计模式】接口隔离原则(Interface Segregation Principle)

本文通过对比两种安全门设计,阐述了接口隔离原则在实际应用中的重要性。首先,原始设计中ISafetyDoor接口过于广泛,导致灵活性受限。然后,改进方案将功能拆分为多个独立接口,如IAntiTheft、IWaterproof和IFireproof,使B品牌门只需实现所需功能,符合接口设计的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。

1 案例分析(安全门)

我们需要创建一个A品牌的安全门,该安全门具有防火防水防盗的功能。可以将防火防水防盗功能提取成一个接口,形成一套规范

using System;

namespace DesignPattern
{
    internal static class Program
    {
        public static void Main(string[] args)
        {
            var door = new ASafetyDoor();
            door.AntiTheft();
            door.FireProof();
            door.WaterProof();
        }
    }
    
    /// <summary>
    /// 防盗门接口
    /// </summary>
    public interface ISafetyDoor
    {
        /// <summary>
        /// 防盗功能
        /// </summary>
        void AntiTheft();
        
        /// <summary>
        /// 防火功能
        /// </summary>
        void FireProof();
        
        /// <summary>
        /// 防水功能
        /// </summary>
        void WaterProof();
    }

    /// <summary>
    /// A 品牌功能
    /// </summary>
    public class ASafetyDoor : ISafetyDoor
    {
        /// <summary>
        /// <inheritdoc cref="ISafetyDoor"/>
        /// </summary>
        public void AntiTheft() => Console.WriteLine("防盗");

        /// <summary>
        /// <inheritdoc cref="ISafetyDoor"/>
        /// </summary>
        public void FireProof() => Console.WriteLine("防火");

        /// <summary>
        /// <inheritdoc cref="ISafetyDoor"/>
        /// </summary>
        public void WaterProof() => Console.WriteLine("防水");
    }
}

上述的设计能够使得A品牌的安全门具有防盗防水防火的功能,能够满足最初的要求。随着市场需求的开发,发现并不是所有的安全门用户都需要安全门具有防盗防水防火的功能,有的仅需要其中两项,甚至一项。如果以上述的接口定义仅有防盗防水功能的B品牌安全门,显然如果实现ISafetyDoor接口就违背了接口隔离原则。

2 案例改进

using System;

namespace DesignPattern
{
    internal static class Program
    {
        public static void Main(string[] args)
        {
            var doorA = new ASafetyDoor();
            doorA.AntiTheft();
            doorA.Fireproof();
            doorA.Waterproof();

            Console.WriteLine("============");
            var doorB = new BSafetyDoor();
            doorB.AntiTheft();
            doorB.Fireproof();
        }
    }
    
    /// <summary>
    /// 防盗接口
    /// </summary>
    public interface IAntiTheft
    {
        /// <summary>
        /// 防盗功能
        /// </summary>
        void AntiTheft();
    }

    /// <summary>
    /// 防水接口
    /// </summary>
    public interface IWaterproof
    {
        /// <summary>
        /// 防水功能
        /// </summary>
        void Waterproof();
    }

    /// <summary>
    /// 防火接口
    /// </summary>
    public interface IFireproof
    {
        /// <summary>
        /// 防火功能
        /// </summary>
        void Fireproof();
    }


    /// <summary>
    /// A 品牌安全门
    /// </summary>
    public class ASafetyDoor :  IAntiTheft, IFireproof, IWaterproof
    {
        /// <summary>
        /// <inheritdoc cref="AntiTheft"/>
        /// </summary>
        public void AntiTheft() => Console.WriteLine("防盗");

        /// <summary>
        /// <inheritdoc cref="Fireproof"/>
        /// </summary>
        public void Fireproof() => Console.WriteLine("防火");

        /// <summary>
        /// <inheritdoc cref="Waterproof"/>
        /// </summary>
        public void Waterproof() => Console.WriteLine("防水");
    }

    /// <summary>
    /// B 品牌安全门
    /// </summary>
    public class BSafetyDoor : IAntiTheft, IFireproof
    {
        /// <summary>
        /// <inheritdoc cref="AntiTheft"/>
        /// </summary>
        public void AntiTheft() => Console.WriteLine("防盗");

        /// <summary>
        /// <inheritdoc cref="Fireproof"/>
        /// </summary>
        public void Fireproof() => Console.WriteLine("防火");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhy29563

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值