• 设计模式


    一、什么是设计模式?
    每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样你就能一次又一次地使用该方案而不必做重复劳动。”
    每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。

    GoF(Gang of Four)
    设计模式四个基本要素:模式名称、问题、解决方案、效果

    二、设计模式七大原则
    1、开放封闭原则:一个软件实体如类,模块和函数应该对扩展是开放的,对修改是关闭的。即软件实体应尽量在不修改原有代码的情况下进行扩展(装饰器)
    2、里氏替换原则:重写父类里面的方法,逻辑可能不一样,但是返回的结果参数啥的要一样(所有引用基类的地方必须能透明的使用其子类的对象)
    3、依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象,要针对接口编程,而不是针对实现编程。(接口类)
    4、接口隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要实现的接口
    5、迪米特法则:一个软件实体应当尽可能少的与其他实体发生相互作用
    6、单一职责原则:一个类只负责一项职责(不要存在多于一个导致类变更的原因,即一个类只负责一项职责)
    7、合同复用原则:多用组合少用继承
    一个类重用另一个类的代码有两种方式
      --1.继承
      --2.组合

    #假如说现在有这样的动物类
    from abc import abstractmethod,ABCMeta   #借助abc模块来实现接口
    #接口类就是为了提供标准,约束后面的子类
    
    # class Animal(metaclass=ABCMeta):
    #     @abstractmethod
    #     def walk(self):
    #         pass
    #
    #     @abstractmethod
    #     def fly(self):
    #         pass
    #
    #     @abstractmethod
    #     def swim(self):
    #         pass
    #
    # class Frog(Animal):
    #     '''像是这样定义一个青蛙类,由于接口类的方法都要被实现,而青蛙只会走,没不要要实现其他的方法
    #     动物不同会的功能也会不同,所以这时候我们就可以选择用接口隔离原则
    #     '''
    #     def walk(self):
    #         print('青蛙会走')
    #
    # obj = Frog()
    # obj.walk()   #会报错
    
    
    # =====================改进-=================
    class AnimalOnLand(metaclass=ABCMeta):
        '''在陆地上的动物'''
        @abstractmethod
        def walk(self):
            pass
    
    class AnimalInSky(metaclass=ABCMeta):
        '''飞行动物'''
        @abstractmethod
        def fly(self):
            pass
    
    class AnimalInWater(metaclass=ABCMeta):
        '''在水里的动物'''
        @abstractmethod
        def swim(self):
            pass
    
    class Tiger(AnimalOnLand):
        def walk(self):
            print('老虎在地上')
    
    class Frog(AnimalOnLand,AnimalInWater):
        def swim(self):
            print('青蛙会游')
    
        def walk(self):
            print('会跳')
    
    obj = Tiger()
    obj.walk()
    
    obj = Frog()
    obj.walk()
    obj.swim()
    接口隔离原则
    # 合同复用原则:多用组合少用继承
    class A:
        def test(self):
            return '你好啊'
    
    class B(A):  #继承
        def test(self):
            return 123
    
    class C:
        def __init__(self):
            self.a = A()   #组合
            self.a.test()
    
        def test(self): 
            return 789
    
    print(B().test())
    
    print(C().a)
    print(C().a.test())
    print(C().test())
    继承和组合

    三、设计模式分类
    1、创建型模式 
    ①简单工厂模式
    ②工厂方法模式
    ③抽象工厂模式
    ④创建者模式
    ⑤原型模式
    ⑥单例模式

    总结创建型模式:
      --依赖于继承的创建型模式:工厂方法模式
      --依赖于组合的创建型模式:抽象工厂模式,创建者模式

    2、行为型模式 
    ①解释器模式
    ②责任链模式
    ③命令模式
    ④迭代器模式
    ⑤中介者模式
    ⑥备忘录模式
    ⑦观察者模式
    ⑧状态模式
    ⑨策略模式
    ⑩访问者模式
    ⑪模板方法模式

    3、结构性模式 
    ①适配器模式
    ②桥模式
    ③组合模式
    ④装饰模式
    ⑤外观模式
    ⑥享元模式
    ⑦代理模式

  • 相关阅读:
    递归算法几个实例---C/C++
    Linux进程管理
    Linux文件传输
    Linux--系统管理
    Git学习笔记
    如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏
    二叉树的非递归层次遍历算法
    二叉树(代码)
    根据后序遍历和中序遍历创建二叉树(代码)
    二叉树性质
  • 原文地址:https://www.cnblogs.com/liwei1153300111/p/8074931.html
Copyright © 2020-2023  润新知