开
-
闭
原则
(目标、
总的指导思想
)
O
pen
C
losed
P
rinciple
对扩展开放,对修改关闭。
增加新功能,不改变原有代码。
例如:Man开车去上班,调用Car的run方法,Car的行驶路线可以随意更改,Man去上班的这件事情不用变
类
的单一职
责(一
个类的定义)
S
ingle
R
esponsibility
P
rinciple
一个类有且只有一个改变它的原因。
例如:Car只负责运送人,Man只管上班
依赖
倒置
(依赖
抽象
)
D
ependency
I
nversion
P
rinciple
客户端代码(调用的类)尽量依赖(使用)抽象。
抽象不应该依赖细节,细节应该依赖抽象。
例如:Man上班需要交通工具Vehicle,至于什么交通工具,有啥就是啥
组合复用原则(复用
的最佳实践
)
C
omposite
R
euse
P
rinciple
如果仅仅为了代码复用优先选择组合复用,而非继承复用。
组合的耦合性相对继承低。
例如,Man的交通工具很多,由自行车,摩托车,小汽车,电动车等等,有什么用什么
里
氏替换
(继承
后的重写
,
指导继承的设计
)
L
iskov
S
ubstitution
P
rinciple
父类出现的地方可以被子类替换,在替换后依然保持原功能。
子类要拥有父类的所有功能。
子类在重写父类方法时,尽量选择扩展重写,防止改变了功能。
例如:Bike,Car的run实现各自是不一样的
迪
米特法则
(类
与类交互的原则
)
L
aw
o
f
D
emeter
不要和陌生人说话。
类与类交互时,在满足功能要求的基础上,传递的数据量越少越好。因为这样可能降低耦合度。
示例:
class Vehicle:
def __init__(self, speed):
self.speed = speed
def run(self):
pass
class Bike(Vehicle):
def run(self):
print("甩起两条小短腿")
class Car(Vehicle):
def run(self):
print("一脚油门的事情")
class Man:
def __init__(self, name, vehicle):
self.name = name
self.vehicle = vehicle
def work(self):
print(self.name, "该去上班了")
self.vehicle.run()
if __name__ == '__main__':
w = Man("老王", Bike(10))
# 老王骑车去上班
w.work()
# 老张开车去上班
z = Man("老张", Car(100))
z.work()