23种设计模式中违反里氏代换原则的设计模式有哪些
时间: 2023-11-10 18:52:07 浏览: 149
里氏代换原则是指程序中的对象应该是可以在不改变程序正确性的前提下被它的子类所替换的。在23种设计模式中,违反里氏代换原则的模式包括以下几种:
1. 模板方法模式:在模板方法中,由子类实现的抽象方法可能会改变模板方法的行为,违反了里氏代换原则。
2. 迭代器模式:在迭代器模式中,子类实现的迭代方法可能会引起迭代器的状态异常,违反了里氏代换原则。
3. 组合模式:在组合模式中,子类实现的添加、删除方法可能会引起整个组合对象的结构异常,违反了里氏代换原则。
4. 工厂方法模式:在工厂方法模式中,子类实现的产品可能会导致工厂方法的返回类型不一致,违反了里氏代换原则。
5. 抽象工厂模式:在抽象工厂模式中,子类实现的产品族可能会导致抽象工厂的返回类型不一致,违反了里氏代换原则。
6. 建造者模式:在建造者模式中,子类实现的部件可能会导致建造者的返回类型不一致,违反了里氏代换原则。
7. 策略模式:在策略模式中,子类实现的具体策略可能会改变策略模式的行为,违反了里氏代换原则。
8. 代理模式:在代理模式中,代理类可能会对被代理类的方法进行过滤或拦截,从而改变系统的行为,违反了里氏代换原则。
这些设计模式虽然违反了里氏代换原则,但是它们都为代码提供了更好的可扩展性和可维护性,具体情况需要根据实际情况进行权衡和选择。
相关问题
java里氏代换原则和依赖倒转原则举例
在Java中,设计模式里的两个重要的原则是“里氏替换原则”(Liskov Substitution Principle, LSP) 和 “依赖倒置原则”(Dependency Inversion Principle, DIP)。
**里氏替换原则(Liskov Substitution Principle)**:
这个原则强调的是子类必须能够替换其基类并仍然保持程序的正确性。例如,假设有一个Animal接口和两个实现了它的子类Dog和Cat。如果代码期望接收任何Animal类型的实例并调用某种通用的行为(如`eat()`),那么使用Dog或Cat替换Animal是不会出现问题的。这是因为Dog和Cat都实现了eat方法并且符合动物的行为预期。
```java
interface Animal {
void eat();
}
class Dog implements Animal {
@Override
public void eat() {
System.out.println("Dog is eating");
}
}
class Cat implements Animal {
@Override
public void eat() {
System.out.println("Cat is eating");
}
}
```
在这个例子中,你可以将Animal类型的数组放入Dog或Cat的对象,因为它们都是Animal的实例,不会违反LSP。
**依赖倒置原则(Dependency Inversion Principle)**:
它建议我们高层模块不应该依赖于低层模块,而是两者都应该依赖于抽象。例如,如果你有一个游戏类Game依赖于具体的图形库Graphics,这违反了DIP。正确的做法是让Game依赖于图形接口IGraphics,然后由框架或配置负责实际选择哪种图形实现。
```java
interface IGraphics {
void draw();
}
class GraphicsImpl implements IGraphics {
@Override
public void draw() {
// 具体图形处理逻辑
}
}
class Game {
private IGraphics graphics;
public Game(IGraphics graphics) {
this.graphics = graphics;
}
public void play() {
graphics.draw();
}
}
```
在这里,Game类只关心如何画图(通过依赖接口IGraphics),而不关心具体是如何实现的。
利斯科夫替换原则(里氏代换原则)、单一职责原则、开闭原则、德(迪)米特法则、依赖倒转原则、合成复用原则分别在博客系统中的应用
在博客系统中,这些设计原则可以应用如下:
1. 利斯科夫替换原则:子类可以替换父类并且不会影响程序的正确性。在博客系统中,可以通过定义抽象的基类或接口,来确保所有具体的博客类都能够被正确地使用。
2. 单一职责原则:一个类只负责一项职责。在博客系统中,每个类应该只负责一种功能,比如博客文章类只负责文章的相关操作,而不要涉及到其它不相关的功能。
3. 开闭原则:对扩展开放,对修改关闭。在博客系统中,可以通过使用接口或抽象类来定义可扩展的模块,从而避免对已有代码的修改。
4. 德(迪)米特法则:一个对象应该对其他对象有尽可能少的了解。在博客系统中,可以通过使用中介者模式或观察者模式,来减少对象之间的直接依赖关系,从而降低耦合度。
5. 依赖倒转原则:高层模块不应该依赖低层模块,它们应该依赖于抽象。在博客系统中,可以通过使用依赖注入或反转控制等技术,来实现高层模块与底层模块之间的解耦。
6. 合成复用原则:尽量使用对象组合,而不是继承来实现复用。在博客系统中,可以通过使用组合模式或装饰器模式等技术,来实现代码的复用,并避免继承带来的一些问题。
阅读全文