作者:大家好,我是阿旭
支持我:点赞收藏⭐️留言
系列专栏:23种设计模式详解-Python
首字母 | 指代 | 概念 |
S | 单一职责原则 | 对象只有一种单一功能 |
O | 开闭原则 | 对扩展开放,对修改禁止 |
L | 里氏替换原则 | 对象应该是可以在不改变程序正确性的前提下被它的子类所替换 |
I | 接口隔离原则 | 多个特定客户端接口要好于一个宽泛用途的接口 |
D | 依赖倒置原则 | 一个方法应该遵从依赖于抽象而不是一个实例 |
不要存在导致类变更的原因,通俗的说是:一个类只负责一项职责。
class User:
pass
class Pay:
pass
可以看到我在这里定义了两个类分别为用户类和支付类,当有需求改变时,你只能是用户需求改变用户类,支付需求改变支付类,确保一个类只负责一项职责。
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。通俗的说是:软件实体应在不修改原有代码的基础上进行扩展。(尽量不改,具体情况随机应变。)
所有引用父类的地方必须能透明的使用其子类的对象。通俗的说是:有一段代码在使用父类对象没问题的情况下,使用字类对象也是肯定没问题的。
class User:
pass
class VIPUser(User):
pass
def show_user(u):
return u.name
这里我们创建了User类,并创建了User类的字类VIPUser,当我们在使用show_user方法时,一定保证传入两种类型的user都能成功。
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些他不需要的接口。
from abc import ABCMeta, abstractmethod
class Animal(metacalss=ABCMeta):
@abstractmethod
def walk(self):
pass
@abstractmethod
def swim(self):
pass
@abstractmethod
def fly(self):
pass
我们在这里定义了一个动物移动方式的抽象接口类,当我们在定义单个动物类继承它的时候,你会发现walk、swim、fly都需要在子类中重新定义,但是有的动物并不是可以走、游、飞,这样程序就会出现错误,所以我们应该改为:
from abc import ABCMeta, abstractmethod
class WalkAnimal(metacalss=ABCMeta):
@abstractmethod
def walk(self):
pass
class SwimAnimal(metacalss=ABCMeta):
@abstractmethod
def swim(self):
pass
class FlyAnimal(metacalss=ABCMeta):
@abstractmethod
def fly(self):
pass
这样的就可以遵循我们的接口隔离原则,不同的字类可以继承一个或者多个父类。
高层模块不应该依赖底层模块,二者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程。
from abc import ABCMeta, abstractmethod
# 接口
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass
# 底层代码1
class AliPay(Payment):
def pay(self, money):
print("支付宝支付%d元" % money)
# 底层代码2
class WechatPay(Payment):
def pay(self, money):
print("微信支付%d元" % money)
订阅专栏,每天学习不同的Python设计模式✌️