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

    简介

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

    设计模式四个基本要素

    模式名称
    问题
    解决方案
    效果

    对象/类

    # 封装:
    """
        区分了类内部和外部
         私有的 双下划线开始的变量,不希望有所变动
    """
    
    # 继承
    """
         复用代码:
            继承,
            组合(self.age=A.age,B用到了A类里的某些功能)
    """
    # 多态:
    """
        语言已经体现多态了,不用考虑对象的类型,会自己找
    """

    多态实例

    class User:
        def show_info(self):
            print("欢迎你,xx普通用户")
    
    
    class VIPUser(User):
        def show_info(self):
            print("欢迎你,xxVIP用户")
    
    
    def func(user):  # 不指定user是什么类型的,python会自己去找,其他语言必须定义好
        user.show_info()  # 多态会通过现象看本质,找的是User的方法
    
    
    a = User()
    func(a)

    接口

     一种特殊的类,声明了若干方法,要求继承该接口的类必须实现这些方法。
    # 作用:
        限制继承接口的类的方法的名称及调用方式;隐藏了类的内部实现。
    
     接口就是一种抽象的基类(父类),限制继承它的类必须实现接口中定义的某些方法

    接口的两种写法

    from abc import abstractmethod, ABCMeta
    
    class Interface(metaclass=ABCMeta):  # 推荐
        @abstractmethod
        def method(self, arg):
            pass
    
    class Interface: # 不调用method不会报错 def method(self, arg): raise NotImplementedError

    接口实例

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    # 当父类必须是子类对象的时候,把父类定义成抽象类,子类是具体
    
    from abc import abstractmethod, ABCMeta
    
    
    # abstract class  抽象类
    
    class Payment(metaclass=ABCMeta):  # 这个类是接口,下面的类按照这个类定义的方法的形式去实现(参数一致)
        @abstractmethod  # 加上这个方法后,就变成抽象类,不能进行实例化
        def pay(self, money):  # 抽象方法不用实现,子类会去实现
            pass
    
    
    class Alipay(Payment):
        def pay(self, money):
            print("支付宝支付%s元" % money)
    
    
    class ApplePay(Payment):
        def pay(self, money):
            print("苹果支付%s元" % money)
    
    
    class WechatPay(Payment):
        def pay(self, money):
            print("微信支付%s元" % money)
    
    
    # 高层
    # def pay_money(payment, money):
    #     payment.pay(money)
    
    a=Alipay()
    a.pay(10)

    六大原则

    # 开闭原则:
        一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
        即软件实体应尽量在不修改原有代码的情况下进行扩展。
    # 里氏(Liskov)替换原则:
        所有引用基类(父类)的地方必须能透明地使用其子类的对象。
    # 依赖倒置原则:# 可以看接口实例
        高层模块不应该依赖低层模块,二者都应该依赖其抽象(接口);抽象不应该依赖细节;细            
        节应该依赖抽象。
        换言之,要针对接口编程,而不是针对实现编程。
    # 接口隔离原则:
        使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
    # 迪米特法则:# 解耦,耦合尽可能小
        一个软件实体应当尽可能少地与其他实体发生相互作用。
    # 单一职责原则:
        不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 

    里氏替换原则实例

    class User:  # 可以不是抽象类
        def show_info(self):
            print("欢迎你,xx普通用户")
    
    
    class VIPUser(User):
        def show_info(self):
            print("欢迎你,xxVIP用户")
    
    
    def func(user):
        user.show_info()

    设计模式分类

    # 创建型模式:
        工厂方法模式  *****
        抽象工厂模式  **
        创建者模式  **
        原型模式
        单例模式 ******
    # 结构型模式
        适配器模式  **
        桥模式
        组合模式  **
        装饰模式
        外观模式
        享元模式
        代理模式  **
    # 行为型模式
        解释器模式  # 做编译器,如写一个python
        责任链模式  **
        命令模式  # 把一个命令分装成一个类,写一个word,桌面
        迭代器模式
        中介者模式
        备忘录模式
        观察者模式  **
        状态模式
        策略模式  **
        访问者模式
        模板方法模式  **

    11

  • 相关阅读:
    UVa 106
    UVa 111
    UVa 105
    UVa 104
    UVa 103
    UVa 102
    UVa 101
    UVa 100
    就决定是你了!
    阿姆斯特朗回旋加速喷气式阿姆斯特朗炮
  • 原文地址:https://www.cnblogs.com/daofaziran/p/11007075.html
Copyright © 2011-2022 走看看