python 设计模式(二) 六大设计原则四 接口隔离原则(Interface Segregation Principle)

接口隔离原则

说明: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

猜你喜欢

转载自blog.csdn.net/ruguowoshiyu/article/details/81195338