简介
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