DIP
1.每个类尽量提供接口或抽象类,或者两者都具备。
2.变量的声明类型尽量是接口或者是抽象类。
3.任何类都不应该从具体类派生。
4.使用继承时尽量遵循里氏替换原则。
5.依赖倒置中的面向抽象类编程,核心思想就是多态,python
语言,天生就是多态,所有类在实例化时,才会根据其属性被创建为具体的对象;而在Java
、Go
等语言中,类一旦被定义就被创建成一个具体的对象,所以在python中依赖倒置原则很常见,也很容易实现
class Car:
def __init__(self, branch):
self.branch = branch
def run(self):
print(f"{self.branch}汽车正在柏油路面疾驰")
class Driver:
def __init__(self, name, car: Car):
self.name = name
self.car = car
def drive(self):
print(f"{self.name}开着{self.car.branch}")
self.car.run()
if __name__ == '__main__':
c = Car("宝马")
d = Driver("张三")
d.drive(c)
b = Car("奔驰")
d.drive(b)
d = Driver("李四")
d.drive(c)
张三开着宝马
宝马汽车正在柏油路面疾驰
张三开着奔驰
奔驰汽车正在柏油路面疾驰
李四开着宝马
宝马汽车正在柏油路面疾驰
package main
import (
"fmt"
)
// ----------------------------抽象层----------------------------
type Car interface {
Run()
}
type Driver interface {
Drive(car Car)
}
// ----------------------------实现层----------------------------
// 如果新来一个司机,只需要增加一个司机实体(不会对原有类进行修改)
// 如果新增一个品牌的车,只需要增加一个品牌实体(不会对原有类进行修改)
type FtCar struct {}
func (f *FtCar) Run() {
fmt.Println("丰田车开起来了...")
}
type BmCar struct {}
func (f *BmCar) Run() {
fmt.Println("宝马车开起来了...")
}
type BzCar struct {}
func (f *BzCar) Run() {
fmt.Println("奔驰车开起来了...")
}
type Zh3 struct {}
func (z *Zh3) Drive(car Car) {
car.Run()
}
func main() {
// ----------------------------业务层----------------------------
// 1.new一个司机张三
zs := &Zh3{}
// 2.new一个奔驰汽车
car := &BzCar{}
// 3.把汽车交给张三驾驶
zs.Drive(car)
}
多态
:是静态语言和动态语言很大的一个区别1.依赖倒置原则可以降低类间的耦合性。
2.依赖倒置原则可以提高系统的稳定性。
3.依赖倒置原则可以减少并行开发引起的风险。
4.依赖倒置原则可以提高代码的可读性和可维护性。