接口隔离原则
说明:1 客户端(调用方)不应该依赖于它不需要的接口
2 类之间的依赖关系应该建立在最小接口上
比如有两个客户端a,客户端b,都通过接口1分别依赖于类a和类b。客户端a通过接口1依赖于类a的方法1和方法2。而客户端b通过接口1依赖于类b的方法2和方法3。那么如果这样的话,接口1就要实现方法1,方法2,方法3。这个接口1就有点庞杂了。而且,客户端a要实现自己不需要的方法3。客户端b要实现自己不需要的方法1。代码如下
import abc
class A(object):
def method1(self):
print('A.method1')
def method2(self):
print('A.method2')
def method3(self):
pass
class B(object):
def method1(self):
pass
def method2(self):
print('B.method2')
def method3(self):
print('B.method3')
class Client(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def method1(self):
pass
@abc.abstractmethod
def method2(self):
pass
@abc.abstractmethod
def method3(self):
pass
class Client_a(Client):
def __init__(self, interface):
self.interface = interface
def method1(self):
self.interface.method1()
def method2(self):
self.interface.method2()
def method3(self):
self.interface.method3()
class Client_b(Client):
def __init__(self, interface):
self.interface = interface
def method1(self):
self.interface.method1()
def method2(self):
self.interface.method2()
def method3(self):
self.interface.method3()
class Interface(object):
def __init__(self, called):
self.called = called
def method1(self):
self.called.method1()
def method2(self):
self.called.method2()
def method3(self):
self.called.method3()
if __name__ == '__main__':
a = A()
b = B()
interface1 = Interface(a)
interface2 = Interface(b)
client_a = Client_a(interface1)
client_b = Client_b(interface2)
client_a.method1()
client_a.method2()
client_b.method2()
client_b.method3()
结果如下
A.method1
A.method2
B.method2
B.method3
遵循接口隔离原则:一个类对另一个类的依赖要建立在最小接口上
上面的代码可以拆分出两个接口类interface1和interface2。接口interface1是客户端a与类a的连接桥梁。接口Interface2是客户端b与类b的连接桥梁。因此,类a就不实现自己不需要的方法3。类b接不用实现自己不需要的方法1。具体代码如下
class A(object):
def method1(self):
print('A.method1')
def method2(self):
print('A.method2')
class B(object):
def method2(self):
print('B.method2')
def method3(self):
print('B.method3')
class Client_a(object):
def __init__(self, interface):
self.interface = interface
def method1(self):
self.interface.method1()
def method2(self):
self.interface.method2()
class Client_b(object):
def __init__(self, interface):
self.interface = interface
def method2(self):
self.interface.method2()
def method3(self):
self.interface.method3()
class Interface1(object):
def __init__(self, called):
self.called = called
def method1(self):
self.called.method1()
def method2(self):
self.called.method2()
class Interface2(object):
def __init__(self, called):
self.called = called
def method2(self):
self.called.method2()
def method3(self):
self.called.method3()
if __name__ == '__main__':
a = A()
b = B()
interface1 = Interface1(a)
interface2 = Interface2(b)
client_a = Client_a(interface1)
client_b = Client_b(interface2)
client_a.method1()
client_a.method2()
client_b.method2()
client_b.method3()
结果如下
A.method1
A.method2
B.method2
B.method3