在以下示例中,我们定义了一个PrinterProtocol
,我们可以使用该PrinterProtocol
来创建多种打印机。
我们在一个协议中添加了所有方法。因此,即使我们想创建一个简单的打印机,我们也必须在协议中实现每个功能。我们可以为协议提供默认的埋葬,但仍然违反了ISP,因为SimplePrinter
也可以调用默认实现。那不是预期的行为。 SimplePrinter
不必调用receiveFax()
方法。
protocol PrinterProtocol {
func printDocument()
func scanDocument()
func sendFax()
func receiveFax()
}
extension PrinterProtocol {
func receiveFax() {
print("Default: Receiving fax...")
}
}
class SimplePrinter: PrinterProtocol {
func printDocument() {
print("Printing document...")
}
func scanDocument() {
print("Scanning document...")
}
func sendFax() {
print("Sending fax...")
}
func receiveFax() {
print("Receiving fax...")
}
}
让我们检查一下如何根据ISPð
实现- 不应强迫客户依靠他们不使用的接口。
- 较大的通用接口应隔离为较小,更具体的接口,这些接口是根据单个客户的需求量身定制的。
- 目标是避免需要客户实施与用例无关的方法的情况。
- 这促进了软件系统中的模块化,可维护性,灵活性和可检验性。
protocol Printer {
func printDocument()
}
protocol Scanner {
func scanDocument()
}
protocol FaxMachine {
func sendFax()
func receiveFax()
}
class AllInOnePrinter: Printer, Scanner, FaxMachine {
func printDocument() {
print("Printing document...")
}
func scanDocument() {
print("Scanning document...")
}
func sendFax() {
print("Sending fax...")
}
func receiveFax() {
print("Receiving fax...")
}
}
class SimplePrinter: Printer {
func printDocument() {
print("Printing document...")
}
}