接口隔离原则
536字约2分钟
2022-04-28
定义
接口隔离原则(Interface Segregation Principle ,ISP).
Clients should not be forced to depend upon interfaces that they do not use.
客户端不应该被强迫依赖它不需要的接口.
示例
假设有一个门, 可以开锁和解锁. 除此之外还可以额外安装警铃. 客户可以自主选择使用一般的门还是有警铃的门.
反例
Door.h
class Door {
public:
virtual void unlock() = 0; // 解锁
virtual void lock() = 0; // 上锁
virtual void installAlarm() = 0; // 安装警铃
virtual void ringAlarm() = 0; // 警铃响起
};
SimpleDoor.h
class SimpleDoor : public Door {
public:
void unlock() override {
// 解锁
}
void lock() override {
// 上锁
}
void installAlarm() override {
// 不需要警铃功能
// 这里的实现可能抛出异常或者做某种标记,表示这个功能不适用
throw std::logic_error("Alarm not supported");
}
void ringAlarm() override {
// 不需要警铃功能
throw std::logic_error("Alarm not supported");
}
};
DoorWithAlarm.h
class DoorWithAlarm : public Door {
public:
void unlock() override {
// 解锁
}
void lock() override {
// 上锁
}
void installAlarm() override {
// 安装警铃
}
void ringAlarm() override {
// 响起警铃
}
};
正例
Interface.cpp
class Lockable {
public:
virtual void unlock() = 0; // 解锁
virtual void lock() = 0; // 上锁
};
class Alarmable {
public:
virtual void installAlarm() = 0; // 安装警铃
virtual void ringAlarm() = 0; // 警铃响起
};
SimpleDoor.h
class SimpleDoor : public Lockable {
public:
void unlock() override {
// 解锁
}
void lock() override {
// 上锁
}
};
DoorWithAlarm.h
class DoorWithAlarm : public Lockable, public Alarmable {
public:
void unlock() override {
// 解锁
}
void lock() override {
// 上锁
}
void installAlarm() override {
// 安装警铃
}
void ringAlarm() override {
// 响起警铃
}
};