• 设计模式


    设计模式

    一、什么是设计模式?

    复制代码
    每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样你就能一次又一次地使用该方案而不必做重复劳动。”
    
    每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。
    
    GoF(Gang of Four)
    
    设计模式四个基本要素:模式名称、问题、解决方案、效果
    复制代码

    二、设计模式七大原则

    1、开放封闭原则:一个软件实体如类,模块和函数应该对扩展是开放的,对修改是关闭的。即软件实体应尽量在不修改原有代码的情况下进行扩展(装饰器)

    2、里氏替换原则:重写父类里面的方法,逻辑可能不一样,但是返回的结果参数啥的要一样(所有引用基类的地方必须能透明的使用其子类的对象)

    3、依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象,要针对接口编程,而不是针对实现编程。(接口类)

    4、接口隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要实现的接口

    5、迪米特法则:一个软件实体应当尽可能少的与其他实体发生相互作用

    6、单一职责原则:一个类只负责一项职责(不要存在多于一个导致类变更的原因,即一个类只负责一项职责)

    7、合同复用原则:多用组合少用继承

           一个类重用另一个类的代码有两种方式

    •  继承
    •  组合

    a、下面来说一下接口隔离原则

     1 #假如说现在有这样的动物类
     2 from abc import abstractmethod,ABCMeta   #借助abc模块来实现接口
     3 #接口类就是为了提供标准,约束后面的子类
     4 
     5 # class Animal(metaclass=ABCMeta):
     6 #     @abstractmethod
     7 #     def walk(self):
     8 #         pass
     9 #
    10 #     @abstractmethod
    11 #     def fly(self):
    12 #         pass
    13 #
    14 #     @abstractmethod
    15 #     def swim(self):
    16 #         pass
    17 #
    18 # class Frog(Animal):
    19 #     '''像是这样定义一个青蛙类,由于接口类的方法都要被实现,而青蛙只会走,没不要要实现其他的方法
    20 #     动物不同会的功能也会不同,所以这时候我们就可以选择用接口隔离原则
    21 #     '''
    22 #     def walk(self):
    23 #         print('青蛙会走')
    24 #
    25 # obj = Frog()
    26 # obj.walk()   #会报错
    27 
    28 
    29 # =====================改进-=================
    30 class AnimalOnLand(metaclass=ABCMeta):
    31     '''在陆地上的动物'''
    32     @abstractmethod
    33     def walk(self):
    34         pass
    35 
    36 class AnimalInSky(metaclass=ABCMeta):
    37     '''飞行动物'''
    38     @abstractmethod
    39     def fly(self):
    40         pass
    41 
    42 class AnimalInWater(metaclass=ABCMeta):
    43     '''在水里的动物'''
    44     @abstractmethod
    45     def swim(self):
    46         pass
    47 
    48 class Tiger(AnimalOnLand):
    49     def walk(self):
    50         print('老虎在地上')
    51 
    52 class Frog(AnimalOnLand,AnimalInWater):
    53     def swim(self):
    54         print('青蛙会游')
    55 
    56     def walk(self):
    57         print('会跳')
    58 
    59 obj = Tiger()
    60 obj.walk()
    61 
    62 obj = Frog()
    63 obj.walk()
    64 obj.swim()
    接口隔离原则

    b、继承和组合

     1 # 合同复用原则:多用组合少用继承
     2 class A:
     3     def test(self):
     4         return '你好啊'
     5 
     6 class B(A):  #继承
     7     def test(self):
     8         return 123
     9 
    10 class C:
    11     def __init__(self):
    12         self.a = A()   #组合
    13         self.a.test()
    14 
    15     def test(self): 
    16         return 789
    17 
    18 print(B().test())
    19 
    20 print(C().a)
    21 print(C().a.test())
    22 print(C().test())
    继承和组合示例

    三、设计模式分类

    创建型模式:

    • 简单工厂模式
    • 工厂方法模式
    • 抽象工厂模式
    • 创建者模式
    • 原型模式
    • 单例模式

    总结创建型模式:

      依赖于继承的创建型模式:工厂方法模式

      依赖于组合的创建型模式:抽象工厂模式,创建者模式

    行为型模式:

    • 解释器模式
    • 责任链模式
    • 命令模式
    • 迭代器模式
    • 中介者模式
    • 备忘录模式
    • 观察者模式
    • 状态模式
    • 策略模式
    • 访问者模式
    • 模板方法模式

    结构性模式:

    • 适配器模式
    • 桥模式
    • 组合模式
    • 装饰模式
    • 外观模式
    • 享元模式
    • 代理模式

     内容待续.......

  • 相关阅读:
    POJ 2253 Frogger
    C++map函数的用法
    蓝桥杯 幂方分解
    蓝桥杯 危险系数
    POJ 2234 Matches Game
    POJ 1852 Ants
    POJ 1144 Network
    POJ1419 Graph Coloring
    poj 2573 Bridge(有A、B、C、D四个人,要在夜里过一座桥……)
    小知识(输出源文件的标题和目前执行行的行数)
  • 原文地址:https://www.cnblogs.com/mqhpy/p/11372486.html
Copyright © 2020-2023  润新知