面向对象SOLID原则-设计模式-第2篇

面向对象设计的SOLID原则

1.开放封闭原则

一个软件实体 (类,函数,模块) 对扩展开放,对修改关闭。也就是 软件实体 应该尽量在不修改原有代码的情况下 进行扩展
举个例子,
装饰器的使用,就可以给某个函数增加新的功能,
类的继承,实现复用 父类的方法

2. 里氏替换原则

所有引用父类的地方必须能够 透明的使用子类对象

from abc import ABCMeta, abstractmethod


class User:
    
    def show_name(self):
        pass
    

class VIPUser(User):
    
    def show_name(self):
        pass
    

def show_user_name(u):
    u.show_name()
    
    
if __name__ == '__main__':
    u = User()
    show_user_name(u)

上面的show_user_name方法 传入User对象没问题的话,传入子类的对象VIPUser()对象 也应当是ok的

3. 依赖倒置原则

高层模块不应该依赖底层模块,二者都应该依赖抽象,抽象不应该依赖细节,细节应该依赖抽象
换言之,需要针对接口编程,而不是针对实现编程
就拿上一篇中关于支付的例子来举例:
调用方(客户端,高层模块)调用接口(底层模块)的时候, 不需要care 具体如何实现支付这个方法的
也不care这个实现方法的效率 关注的只是这个支付方法的传入参数 以及 方法的返回值
这个支付的方法 就是抽象出来的接口,
而具体实现过程是依赖这个抽象接口 而生存的,
但是抽象的接口依赖具体的细节 包括你用别的语言实现 或者调用别的第三方实现 都无所谓

4. 接口隔离原则

使用多个换专门的接口,而不是使用单一的总接口,
也就是, 客户端不应该依赖那些它不需要的接口
举个例子:

class Animal(metaclass=ABCMeta):
    
    @abstractmethod
    def walk(self):
        pass
    
    @abstractmethod
    def swim(self):
        pass
    
    @abstractmethod
    def fly(self):
        pass


class Tiger(Animal):
    
    def walk(self):
        pass
    
    def swim(self):
        # 老虎不会游泳
        pass
    
    def fly(self):
        # 老虎不会飞
        pass

上面的例子中,Animal这个类定义了三个抽象方法,所有继承Animal类的子类 都必须 要实现walk swim fly三个方法 但是老虎只会跑 不会飞 也不会 游泳怎么办?????

接口隔离原则就派上用场了

from abc import ABCMeta, abstractmethod


class LandAnimal(metaclass=ABCMeta):

    @abstractmethod
    def walk(self):
        pass


class WaterAnimal(metaclass=ABCMeta):

    @abstractmethod
    def swim(self):
        pass


class SkyAnimal(metaclass=ABCMeta):

    @abstractmethod
    def fly(self):
        pass


class Tiger(LandAnimal):

    def walk(self):
        pass
    
    
class Frog(LandAnimal, WaterAnimal):
    
    def swim(self):
        pass
    
    def walk(self):
        pass
 

class Swan(WaterAnimal, SkyAnimal):
    def swim(self):
        pass
    
    def fly(self):
        pass

将Animal这个类根据功能(方法 method)的不同进行拆分

5. 单一职责

不要存在多于一个导致类变更的原因
通俗的讲一个类只负责一项职责

原文地址:https://www.cnblogs.com/cavalier-chen/p/14714746.html