设计原则之里氏替换原则

只看概念比较抽象,先上实例。一个违反里氏替换原则的例子、一个遵守里氏替换原则的例子。

// 绘制图形
void drawShape(Shape shape) {
    
    
	if (shape.type == Shape.Circle) {
    
    
		drawCircle((Circle) shape);
	} else if (shape.type == Shape.Square) {
    
    
		drawSquare((Square) shape);
	} else {
    
    
		......
	}
	// 新增图像必需要修改drawShape方法,添加if判断来支持新的图形,违反了开闭原则
	// 同样是因为新增图像必需要修改drawShape方法,违反了里氏替换原则
}
// 在基类Shape中定义一个抽象方法
public abstract Shape {
    
    
	public abstract draw();
}
// 然后修改drawShape方法
void drawShape(Shape shape) {
    
    
	shape.draw();
}
// 这样优化使drawShape既满足开闭原则又满足里氏替换原则。在使用基类的这个方法中可以用子类替换,程序正常运行(这就是里氏替换设计原则)

理解
在一块业务逻辑需要依赖另外一块业务逻辑的场景中,不直接依赖具体的实现,而是依赖其基类的接口方法或抽象方法,
BUT。。。。。在业务逻辑执行时可用子类替换基类,这种设计原则就叫做里氏替换原则
其实,里氏替换原则的原理就是利用了多态特性。通俗地说,接口或者抽象类的多个实现就是多态。通过多态可以实现面向接口进行编程,在程序运行时绑定具体的实现类,从而实现了类之间不需要直接耦合,就可以实现关联。
里氏替换原则是一种类的继承关系设计原则

一句话总结:子类必须可以替换掉基类,并且不影响使用基类使用方

猜你喜欢

转载自blog.csdn.net/feifeixiongxiong/article/details/113006918