zoukankan      html  css  js  c++  java
  • 设计模式

    一、什么是设计模式

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

    二、设计模式的七大原则

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

    a、接口隔离原则

    #假如说现在有这样的动物类
    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()
    
    接口隔离原则
    View Code

    b、继承和组合

    # 合同复用原则:多用组合少用继承
    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())
    
    继承和组合示例
    View Code

    三、设计模式分类

    创建型模式:

    总结创建型模式:

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

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

    行为型模式:

    结构性模式:

  • 相关阅读:
    GTK+ 3.6.2 发布,小的 bug 修复版本
    RunJS 新增 Echo Ajax 测试功能
    Mozilla 发布 Popcorn Maker,在线创作视频
    Sina微博OAuth2框架解密
    Mina状态机State Machine
    Mozilla 发布 Shumway —— 纯JS的SWF解析器
    Code Browser 4.5 发布,代码浏览器
    ROSA 2012 "Enterprise Linux Server" 发布
    ltrace 0.7.0 发布,程序调试工具
    Artifactory 2.6.5 发布,Maven 扩展工具
  • 原文地址:https://www.cnblogs.com/xiao-xue-di/p/9872768.html
Copyright © 2011-2022 走看看