【软件设计原则和设计模式】

软件设计原则

软件设计原则(Software Design Principles)是一些在软件开发中遵循的指导性准则,它们旨在创建易于维护、易于扩展、易于复用、易于测试、易于理解和阅读的软件。

以下是常见的七个软件设计原则:

1. 单一职责原则(SRP)

一个类应该只有单一职责,即一个类只应该负责一项任务或功能。这样可以使得类更加简单,易于修改和维护。

2. 开放封闭原则(OCP)

系统应该对扩展开放而对修改关闭,这意味着应该通过添加新的代码来扩展现有的系统,而不是修改已经存在的代码来达到这个目的。

3. 里氏替换原则(LSP)

子类对象可以完全替代父类对象的行为,而不会影响程序的正常进行。

4. 接口隔离原则(ISP)

接口应该被应用程序拆分成更小、更具体的接口,以避免实现类不需要的方法。这可以使得实现接口的类更加灵活。

5. 依赖反转原则(DIP)

高层模块不应该依赖低层模块,应该依赖于抽象接口。同时,抽象接口不应该依赖于具体实现,而具体实现应该依赖于抽象接口。

6. 迪米特法则(LoD)

一个对象应该对其他对象有尽可能少的了解,以实现对象的松耦合,减少对象之间的耦合性。

7. KISS原则(Keep It Simple, Stupid)

保持简单的原则,尽可能地使用简单和直接的设计来解决问题,避免复杂的设计,从而方便维护和理解。

软件设计模式

软件设计模式(Software Design Patterns)是在软件开发中经常遇到的一些通用问题的解决方案。这些模式是由经验丰富的程序员总结出来的,并经过多年的实践验证。

以下是常见的 23 种软件设计模式:

创建型模式

工厂方法模式(Factory Method)

定义一个用于创建对象的接口,由子类实现具体对象的创建。

抽象工厂模式(Abstract Factory)

提供一个创建一系列产品的接口,而不用指定具体的产品类。

单例模式(Singleton)

确保一个类只有一个实例存在,并提供全局访问点。

建造者模式(Builder)

将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

原型模式(Prototype)

通过复制已有对象来创建新对象,从而避免耗费资源的创建过程。

结构型模式

适配器模式(Adapter)

将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以在一起工作。

桥接模式(Bridge)

将抽象部分与实现部分分离,使它们可以独立变化,从而可以动态地组合。

组合模式(Composite)

将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

装饰器模式(Decorator)

动态地给一个对象增加一些额外的职责,就增加功能来说,比继承更为灵活。

外观模式(Facade)

为一组复杂的子系统提供一个统一的接口,使得这些子系统更容易使用。

享元模式(Flyweight)

运用共享技术来有效地支持大量细粒度的对象,从而提高系统性能。

行为型模式

职责链模式(Chain of Responsibility)

将请求的发送者和接收者解耦,使得多个对象都有机会处理此请求。

命令模式(Command)

将请求封装成对象,从而让你使用不同的请求、队列或者日志来参数化其它对象。同时也支持可撤销操作。

解释器模式(Interpreter)

定义语言的文法,并且建立一个解释器来解释该语言中的句子。

迭代器模式(Iterator)

提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示。

中介者模式(Mediator)

用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显式地相互作用,从而降低了耦合度。

备忘录模式(Memento)

在不破坏封装性的前提下,捕获到一个对象的内部状态,并在该对象之外保存这个状态,从而可以在以后将对象恢复到先前的状态。

观察者模式(Observer)

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。

状态模式(State)

允许一个对象在其内部状态改变时改变它的行为,看起来似乎修改了它的类。

策略模式(Strategy)

定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。

模板方法模式(Template Method)

定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

访问者模式(Visitor)

定义一个新的操作,将不同类之间的操作分离开来,使得对象结构可以在不改变各元素的类前提下,定义作用于这些元素的新操作。

空对象模式(Null Object)

提供一种解决“空对象”的方案,避免了对象实例为空时,代码的复杂性和错误性。

猜你喜欢

转载自blog.csdn.net/muzillll/article/details/131266740