#include <iostream>
#include <memory>
class IPrintable {
public:
virtual ~IPrintable() = default;
virtual void print() = 0;
};
class IScannable {
public:
virtual ~IScannable() = default;
virtual void scan() = 0;
};
class SimplePrinter : public IPrintable {
public:
void print() override {
std::cout << "[SimplePrinter] Printing a document..." << std::endl;
}
};
class SimpleScanner : public IScannable {
public:
void scan() override {
std::cout << "[SimpleScanner] Scanning a document..." << std::endl;
}
};
class MultiFunctionMachine : public IPrintable, public IScannable {
private:
public:
void print() override {
std::cout << "[MultiFunctionMachine] Printing..." << std::endl;
}
void scan() override {
std::cout << "[MultiFunctionMachine] Scanning..." << std::endl;
}
};
void performPrint(IPrintable& printer) {
printer.print();
}
void performScan(IScannable& scanner) {
scanner.scan();
}
int main() {
SimplePrinter printer;
SimpleScanner scanner;
MultiFunctionMachine mfp;
std::cout << "===== Example of the Interface Segregation Principle =====" << std::endl;
std::cout << "\n--- Using the printer ---" << std::endl;
performPrint(printer);
std::cout << "\n--- Using the scanner ---" << std::endl;
performScan(scanner);
std::cout << "\n--- Using the multifunction device ---" << std::endl;
performPrint(mfp);
performScan(mfp);
std::cout << "\nThe Interface Segregation Principle is followed: "
<< "SimplePrinter and SimpleScanner are not forced to implement methods they do not need.\n";
return 0;
}