设计模式:讲在设计模式之前
一、什么是设计模式
1、设计模式的定义
2、注意事项
设计模式就是底层实现起来麻烦,上层调用简单
设计模式就是“有一个套路 ,分几个类,几个方法,几个属性”
3、为什么要有设计模式
在面向对象之前用的面向过程,小软件,需求不断增加,代码量爆增,大家的代码合并不了,几百万几千万的项目都不能交付,爆发了软件危机,才有了软件工程,设计模式,面向对象
二、讲在设计模式之前
1、封装
1、对象的行为对于外部世界来说就是不可见的,或者说对象的状态信息是私密的
2、客户端不能通过直接操作来改变对象的内部状态。相反,客户端需要通过发送消息来请求对象改变其内部状态。对象可以根据请求的类型,通过特定的成员函数(例get和set)改变他们的内部状态,
以做出相应的响应
3、在python中,封装(数据和方法的隐藏)的概念不是隐式的,因为它没有提供封装所需的关键字,诸如public、private和protected(在诸如c++或java之类的语言汇总,都提供了这些关键字)
当然,如果在变量或函数名 前加上前缀_,就可以将其可访问性变为私有
4、私有属性很重要
2、继承
多态的两种类型
对象根据输入参数提供方法的不同实现
不同类型的对象可以使用相同的接口
对于python来说,多态是该语言的内置功能,例如操作符"+"可以应用于两个整数以进行加法运算,也可以应用于字符串来连接它们。在下面的示例中,字符串、元祖或列表都可以通过证书索引进行访问
它为我们展示了python内置类型的多态
B是一种特殊的A才会用继承
3、多态
Python是一种多态语言,程序员不用考虑多态
4、接口
一种特殊的类,声明了若干方法,要求继承该接口的类必须实现这些方法。
作用:限制继承接口的类的方法的名称及调用方式;隐藏了类的内部实现。
接口就是一种抽象的基类(父类),限制继承它的类必须实现接口中定义的某些方法
1、用接口专业代码
from abc import abstractmethod, ABCMeta #抽象 class Payment(metaclass=ABCMeta): @abstractmethod def pay(self, money): raise NotImplementedError #底层 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)
#高层
payment = Alipay
payment.pay(100)
2、新人代码
class WeiXinZhiFu: def huaqian(self, money): print("微信支付%s元"%money) class WangYinzhiFu: def huaqian(self, money): print("网银支付%s元"%money)
5、组合
它是一种将对象或类组合成更复杂的数据结构或软件实现的方法
在组合中,一个对象可用于条用其他模块中的成员函数,这样一来,无序通过集成就可以实现基本功能的跨模块作用
四、设计模式6大原则
1、开闭原则
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展
白话:加功能可以很方便的加,改代码尽量不要改?
python中的装饰器就用的是开闭原则
2、里氏(Liskov)替换原则
所有引用基类(父类)的地方必须能透明地使用其子类的对象。
传父类ok,之类也应该不会报错有问题,也就是之类不能覆盖父类
尤其在“替换父类代码的时候”
3、依赖倒置原则
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程
高层和底层不直接依赖,高层依赖底层 底层和高层不是一个人写的,底层修改,高层也要修改,抽象就是接口编程
1、用接口专业代码
from abc import abstractmethod, ABCMeta #抽象接口 class Payment(metaclass=ABCMeta): @abstractmethod def pay(self, money): raise NotImplementedError #底层 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)
返回的参数
2、新人代码
class WeiXinZhiFu: def huaqian(self, money): print("微信支付%s元"%money) class WangYinzhiFu: def huaqian(self, money): print("网银支付%s元"%money)
4、接口隔离原则
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
就是不要乱继承:只有B是一种特殊的A才会用继承
5、迪米特法则
一个软件实体应当尽可能少地与其他实体发生相互作用
解偶
6、单一职责原则
不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
一个类只干一样的活
7、合成复用原则
1、类适配器 用的是继承
class WeChatPay(Payment, WeiXinZhiFu): def pay(self, money): self.huaqian(money)
2、对象适配器------用的是组合
class PayAdapter(Payment): def __init__(self, payment): self.payment = payment def pay(self, money): if hasattr(self, "pay"): return self.payment.pay(money) else: return self.payment.huaqian(money)