软件设计原则之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();
}
相关推荐
kyle~8 小时前
ISP---RAW数据解析:从PixelFormat、Packed_Buffer到Bayer解码
数码相机·接口隔离原则
FLJwu9 小时前
镜头模组与画质量产实战 03:运动相机 ISP 图像调校、杂光鬼影抑制与来料验收标准|20 年源头工厂量产经验
经验分享·数码相机·产品运营·接口隔离原则·相机
kyle~1 天前
ISP---RAW 成像的物理基础
计算机视觉·接口隔离原则·相机
kyle~1 天前
ISP--- RAW 图像 从传感器噪声模型到快门时序与频闪效应
人工智能·计算机视觉·接口隔离原则
PHP实战开发录2 天前
PHP接口参数没变为什么总是验签失败
php·开发·接口隔离原则
啊阿狸不会拉杆4 天前
《计算机网络-自顶向下方法》5.4 ISP之间的路由选择:BGP 读书笔记
网络·计算机网络·接口隔离原则
运维行者_5 天前
ISP 企业级带宽计费怎么做?网络流量计费的 6 大核心能力
运维·服务器·网络·数据库·支持向量机·接口隔离原则
AomanHao13 天前
【ISP】sensor高亮灰度溢出及anti-bloomimg功能
接口隔离原则·isp·sensor
磐时信息技术16 天前
磐时助力中科创达 ISP Tuning 项目通过 ASPICE L2 评估
接口隔离原则
PHP实战开发录20 天前
微信小程序多环境配置混用排查记录
微信小程序·php·开发·接口隔离原则