目录
设计模式分类
面向对象
接口
面向对象设计原则
里氏替换原则
依赖倒置原则
接口隔离原则
单一职责原则
设计模式是对软件设计中普遍存在或反复出向的各种问题所提出的解决方案。每一个设计模式系统地被命名、解释和评价了面向对象系统中一个重要和重复出现的设计。
设计模式分类
创建型模式:工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式。隐藏底层模块的逻辑,关注怎么创建对象
。
结构型模式:适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式。类之间如何协同工作,应该组成什么结构
。
行为型模式:解释器模式、责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式、模板方法模式。关注行为,也就是方法,应该怎样某些行为
。
面向对象
设计模式解决的就是面向对象中的问题。需要指导面向对象的三大特性是 封装、继承和多态
,封装是把数据和方法封装到类中,继承是类之间复用代码,多态在Python中默认支持的,Python是一种多态的语言。
接口
接口是若干抽象方法的集合
。接口的作用是限制实现接口的类必须按照接口给定的调用方式实现这些方法,对高层模块隐藏了类的内部实现。下面通过一个简单的例子来加强对接口的理解:
from abc import ABCMeta, abstractmethod# 具有抽象方法的类就是接口类,
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):"""抽象方法,在实现的类中必须实现的方法。限制实现接口的类必须按照接口给定的调用方式实现这些方法:param money: :return: """pass# 不能说是继承接口类,应该说是实现接口
class Alipay(Payment):def pay(self, money):"""实现接口类中的必须实现的方法:param money::return:"""print("支付宝支付了{0}元!".format(money))class WechatPay(Payment):def pay(self, money):"""实现接口类中的必须实现的方法:param money::return:"""print("微信支付了%d元!" % (money))# 下面是高层代码,在调用的时候是看不到底层类的内部实现
a = Alipay()
w = WechatPay()
a.pay(100)
w.pay(100)
面向对象设计原则
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应该在不修改原代码的情况下进行修改。
里氏替换原则
所有引用父类的地方必须能透明地使用其子类地方必须能透明地使用其子类的对象,一个简单的例子加强理解
class User(object):def print_name(self):passclass VipUser(User):def print_name(self):"""保证参数和返回值类型需要和父类一样:return:"""pass
def print_name(u):"""不论使用User还是继承User的VipUser,调用的方式是一样的。这就要求User和VipUser的方法参数和返回值类型是一样的:param u::return:"""u.print_name()
依赖倒置原则
高层模块不应该依赖底层模块,二者都应该依赖抽象。抽象不应该依赖细节,细节应该应该依赖抽象。要针对接口编程,而不是针对实现编程
。通过例子加强理解:
from abc import ABCMeta, abstractmethod# 接口,抽象不应该依赖细节
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):pass# 底层代码和高层代码都是细节,细节应该依赖抽象
# 底层代码
class Alipay(Payment):def pay(self, money):print("支付宝支付了{0}元!".format(money))class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))# 高层代码,高层模块不应该依赖底层模块,二者都应该依赖抽象
a = Alipay()
w = WechatPay()
a.pay(100)
w.pay(100)
接口隔离原则
使用多个专门的接口,而不使用单一的总结口,高层的代码不应该依赖那些它不需要的接口。通过例子加强理解:
from abc import ABCMeta, abstractmethodclass LandAnimal(metaclass=ABCMeta):@abstractmethoddef walk(self):passclass WaterAnimal(metaclass=ABCMeta):@abstractmethoddef swim(self):passclass SkyAnimal(metaclass=ABCMeta):@abstractmethoddef fly(self):pass# 高层的代码不应该依赖那些它不需要的接口
class Tiger(LandAnimal):def walk(self):pass# 高层的代码不应该依赖那些它不需要的接口
class Frog(LandAnimal, WaterAnimal):def walk(self):pass
单一职责原则
不要存在多于一个导致类变更的原因,一个类只负责一项职责,一个类只做一件事。把面向过程的代码放到类中,虽然用到了类,但不是面向对象
。