Interface Isolation Principle
About 399 wordsAbout 1 min
2025-03-27
Definition
Clients should not be forced to depend upon interfaces that they do not use.
Example
Suppose there is a door that can be locked and unlocked. In addition, an alarm can be installed. Customers can choose to use a normal door or a door with an alarm.
Counter Example
Door.h
class Door {
public:
virtual void unlock() = 0; // Unlock
virtual void lock() = 0; // Lock
virtual void installAlarm() = 0; // Install alarm
virtual void ringAlarm() = 0; // Alarm rings
};
SimpleDoor.h
class SimpleDoor : public Door {
public:
void unlock() override {
// Unlock
}
void lock() override {
// Lock
}
void installAlarm() override {
// Alarm function is not needed
// The implementation here may throw an exception or make some kind of mark to indicate that this function is not applicable
throw std::logic_error("Alarm not supported");
}
void ringAlarm() override {
// Alarm function is not needed
throw std::logic_error("Alarm not supported");
}
};
DoorWithAlarm.h
class DoorWithAlarm : public Door {
public:
void unlock() override {
// Unlock
}
void lock() override {
// Lock
}
void installAlarm() override {
// Install alarm
}
void ringAlarm() override {
// Ring alarm
}
};
Positive Example
Interface.cpp
class Lockable {
public:
virtual void unlock() = 0; // Unlock
virtual void lock() = 0; // Lock
};
class Alarmable {
public:
virtual void installAlarm() = 0; // Install alarm
virtual void ringAlarm() = 0; // Ring alarm
};
SimpleDoor.h
class SimpleDoor : public Lockable {
public:
void unlock() override {
// unlock
}
void lock() override {
// lock
}
};
DoorWithAlarm.h
class DoorWithAlarm : public Lockable, public Alarmable {
public:
void unlock() override {
// unlock
}
void lock() override {
// lock
}
void installAlarm() override {
// install alarm
}
void ringAlarm() override {
// ring alarm
}
};
Contributors
Changelog
3/27/25, 9:30 AM
View All Changelog
270fc
-feat(docs): add solid principles serieson
Copyright
Copyright Ownership:dingyuqi
License under:Attribution-NonCommercial-NoDerivatives 4.0 International (CC-BY-NC-ND-4.0)