zoukankan      html  css  js  c++  java
  • 面向对象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. 单一职责

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

  • 相关阅读:
    题解 P2168 【[NOI2015]荷马史诗】
    题解 P2607 【[ZJOI2008]骑士】
    题解 P4323 【[JSOI2016]独特的树叶】
    题解 P4074 【[WC2013]糖果公园】
    题解 P4552 【[Poetize6] IncDec Sequence】
    题解 P3469 【[POI2008]BLO-Blockade】
    题解 P5058 【[ZJOI2004]嗅探器】
    题解 P4767 【[IOI2000]邮局】
    题解 CF463D 【Gargari and Permutations】
    TensorFlow学习笔记之二——安装和运行
  • 原文地址:https://www.cnblogs.com/cavalier-chen/p/14714746.html
Copyright © 2011-2022 走看看