什么是设计模式,设计模式的分类和原则

设计模式是软件开发中的解决方案集合,包括创建型、结构型和行为型三类,如单例、工厂方法和适配器模式等。设计模式遵循单一职责、开闭、里氏替换等原则,以提高代码的可重用性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是设计模式

设计模式是我们在软件开发过程中,基于特定情况的下为一些重复性出现的问题提供的一个有效的解决方案。无论是在框架还是应用软件的开发中,设计模式的在被广泛的应用。

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。

设计模式的分类

虽然设计模式只有23种,但是每一个设计模式都某一个可重复的设计问题提供了一套解决方案。根据他们的用途可以分为创建型,结构型和行为型三种。其中创建型模式主要用于描述如何创建对象,结构型模式主要用于描述如何实现类或对象的组合,行为型模式主要用于描述类或对象怎么交互以及怎么分配职责。在GoF23种设计模式中包含5种创建型设计模式,7种结构型设计模式和11种行为型设计模式。

创建型

1. 单例模式
2. 工厂方法模式
3. 抽象工厂模式
4. 原型模式
5. 建造者模式

结构型

1. 适配器模式
2. 桥接模式
3. 组合模式
4. 装饰模式
5. 外观模式
6. 享元模式
7. 代理模式

行为型

1. 职责链模式
2. 命令模式
3. 解释器模式
4. 迭代器模式
5. 中介者模式
6. 备忘录模式
7. 观察者模式
8. 状态模式
9. 策略模式
10. 模板方法模式
11. 访问者模式

设计模式的原则

单一职责原则(Single Responsibility Principle, SRP)

单一职责原则是最简单的面向对象设计原则,他用于控制类的粒度大小。单一职责原则意思是说一个类只负责一个功能领域的事情,如果一个类承担的职责越多,那么他的可复用性就越小,耦合性也会变高,但其中一个职责发生变化时,很可能也会导致其他职责的变化。单一职责是实现高内聚,低耦合的指导方针。

开闭原则(Open-Closed Principle, OCP)

开闭原则是面向对象的可复用性设计的基石。开闭原则意思是对扩展开放,对修改关闭。即实体应该在不修改原有代码的基础上进行扩展。这个实体可以是一个模块,一个由多个类组成的局部结构或一个独立的类。抽象化是开闭原则的关键。

里氏代换原则(Liskov Substitution Principle,LSP)

里氏替换原则意思是所有引用基类(父类)的地方必须能透明地使用其子类对象。在软件中将一个基类对象替换成他的子类对象,程序将不会产生任何错误喝异常,但是反之则不可以,如果一个软件实体使用的是一个子类对象的话,那么他不一定能够使用基类对象。里氏替换原则是实现开闭原则的重要方式之一。

在使用里氏替换原则时需要注意一下几点:

  1. 子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。根据里氏替换原则,为了保证系统的扩展性,在程序中通常使用父类来进行定义,如果一个方法只存在子类中,在父类中不提供相应的声明,则无法在以父类定义的对象中使用该方法。
  2. 在使用里氏替换原则时尽量把父类设计为抽象类或接口,让子类继承父类或实现父接口,并实现父类中声明的方法,在子类实例替换父类实例时就可以很方便的扩展系统的功能。

依赖倒转原则(Dependency Inversion Principle, DIP)

如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一。依赖倒转原则意思是抽象不应该依赖于细节,细节应当依赖抽象,换言之,要针对接口编程,而不是针对实现编程。在实现依赖倒转原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入的方式注入到其他对象中。

接口隔离原则(Interface Segregation Principle, ISP)

接口隔离原则意思是使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些他不需要的接口。当一个接口太大时,我们需要将他分割成一些更小的接口,使用该接口的客户端只需要知道与之相关的方法。每一个接口应该只承担相对独立的角色。

合成复用原则(Composite Reuse Principle, CRP)

复用原则意思是尽量使用对象组合,而不是继承来达到复用的目的。就是在一个新对象里通过关联关系来使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到使用功能的目的。

在面向对象设计中,可以通过两种方法在复用已有的实现,一种是通过组合的关系,一种是继承。但是应该优先考虑使用组合的方式,这样可以降低类之间的耦合,一个类的变化对其他类造成的影响就相对较少,其次在考虑使用继承的方式,并且需要严格遵守里氏替换原则,有效使用继承会有助于问题解决,滥用继承反而会增加系统复杂度。

通过继承来复用的主要问题在于破坏系统的封装性,因为继承会将基类的实现暴露给子类,如果基类发生改变,那么子类的实现也不得不发生改变。

迪米特法则(Law of Demeter, LoD)

迪米特原则意思是一个实体应当尽可能少的与其他实体发生相互作用。如果一个系统符合迪米特原则,那么当其中某个模块发生改变时,就会尽量少的影响其他模块。该原则可以降低系统的耦合度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值