• 面向对象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. 单一职责

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

  • 相关阅读:
    HDU4507 吉哥系列故事――恨7不成妻(数位dp)
    UCF Local Programming Contest 2017 G题(dp)
    ICPC Latin American Regional Contests 2019 I题
    UCF Local Programming Contest 2017 H题(区间dp)
    HDU2089 不要62
    AcWing1084 数字游戏II(数位dp)
    UCF Local Programming Contest 2017 F题(最短路)
    Google Code Jam 2019 Round 1A Pylons(爆搜+贪心)
    AcWing1083 Windy数(数位dp)
    Vue
  • 原文地址:https://www.cnblogs.com/cavalier-chen/p/14714746.html
Copyright © 2020-2023  润新知