软件设计原则之ISP接口隔离原则

(ISP) 接口隔离原则 Interface Segregation Principle

核心原则

不应该强迫客户程序依赖它们不用的方法。

场景描述

在大家的认知中,大多数鸟类都有翅膀并可以飞行。但是在奇妙的大自然中总有一些特例,如鸵鸟虽然有翅膀,但是不会飞行。

如果我们设计一个鸟的基类,并含有飞行相关方法,则这类方法将不适用于鸵鸟。

因此一些设计者会喜欢在这类方法中抛出异常或者使用断言的方式来进行处理。

复制代码
#include <cassert>
#include <iostream>

class Bird {
public:
    virtual void sleep() = 0;
    virtual void fly()   = 0;
};

// 鸽子
class Pigeon : public Bird {
public:
    void sleep() override {
        std::cout << "The pigeon is sleeping" << '\n';
    }
    void fly() override {
        std::cout << "The pigeon is flying" << '\n';
    }
};

// 鸵鸟
class Ostrich : public Bird {
public:
    void sleep() override {
        std::cout << "The ostrich is sleeping" << '\n';
    }
    void fly() override {
        std::cout << "The ostrich can not fly" << '\n';
        assert(false);
    }
};

int main() {
    Ostrich bird;
    bird.sleep();
    // 鸵鸟不会飞,不合理
    bird.fly();
}

问题暴露

显然,既然方法是存在的,那难免会有不熟悉的开发者去调用它。并且在一些多态接口中,接口内部不知道外部传入的对象是什么,极有可能会去调用这些不合理的函数。

因此我们需要解耦,将各类方法的力度更加细化,不同的对象只去实现它应该并且能够实现的接口。

复制代码
#include <cassert>
#include <iostream>

class CanSleep {
public:
    virtual void sleep() = 0;
};

class CanFly {
public:
    virtual void fly() = 0;
};

// 鸽子
class Pigeon : public CanSleep, public CanFly {
public:
    void sleep() override {
        std::cout << "The pigeon is sleeping" << '\n';
    }
    void fly() override {
        std::cout << "The pigeon is flying" << '\n';
    }
};

// 鸵鸟
class Ostrich : public CanSleep {
public:
    void sleep() override {
        std::cout << "The ostrich is sleeping" << '\n';
    }
};

int main() {
    Ostrich bird;
    // 只使用,该对象可以使用的方法
    bird.sleep();
}
相关推荐
xunyan62347 天前
4-1 静态数码管显示(SDCC + Notepad++ + STC-ISP/普中ISP)
接口隔离原则
xunyan62347 天前
3-1 独立按键控制LED亮灭(SDCC + Notepad++ + STC-ISP/普中ISP)
单片机·嵌入式硬件·接口隔离原则
kyle~8 天前
实时系统通信抖动(Jitter)
计算机视觉·机器人·接口隔离原则·传感器
xunyan62349 天前
3-1 独立按键控制LED状态(SDCC + Notepad++ + STC-ISP/普中ISP)
notepad++·接口隔离原则
xunyan62349 天前
3-3 独立按键控制LED显示二进制(SDCC + Notepad++ + STC-ISP/普中ISP)
接口隔离原则
xunyan62349 天前
51 单片机LED流水灯(SDCC + Notepad++ + STC-ISP/普中ISP)
单片机·嵌入式硬件·接口隔离原则
雪雪爱冲浪10 天前
2026 年网络爬虫领域的Puppeteer vs. Playwright
爬虫·网络协议·测试工具·接口隔离原则
DolitD13 天前
3D应用多实例并发中的GPU隔离技术路径分析
容器·gru·接口隔离原则
xunyan623413 天前
51 单片机LED闪烁(SDCC + Notepad++ + STC-ISP/普中ISP)
单片机·notepad++·接口隔离原则
运维行者_14 天前
PHP性能监控怎么做?从响应时间到慢函数的6个关键指标
运维·服务器·开发语言·网络·支持向量机·php·接口隔离原则