编程七大原则和23种设计模式汇总整理
admin
撰写于 2025年 03月 18 日

三大类

创建型模式

共五种

工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

结构型模式

共七种

适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式

行为型模式

共十一种

策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

七大原则

开闭原则(总原则)

对扩展开放,对修改封闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码

实现原理

通过接口,抽象类,把一组相关联或者相似的业务进行抽离出来,定义好方法,编写抽象业务层

通过具体的实现类去实现接口,抽象类,重载接口/抽象类的方法,完成具体业务的实现处理

后期需要扩展新业务,只需要去实现定义好的抽象业务层类,然后编写具体的业务代码,而不去修改已有的实现业务类,从而实现了对扩展开放和修改封闭

里氏替换原则

所有引用基类对象的地方能够透明地使用其子类的对象

原则补充

里氏替换原则是对开闭原则的规范约束

基类可以出现的地方,子类一定可以出现

子类对父类的方法尽量不要重写和重载,会破坏父类定义好的规范和契约

依赖倒置原则

面向接口编程,依赖于抽象而不依赖于具体

写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。

实现原理

// 支付购买商品
Pay pay=new AliPay();
payProduct(pay);

public void payProduct(Pay pay){
 //真正支付的方法,不依赖于具体的实现类,直接调用接口方法
 pay.payMoney();

}

单一职责原则

规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分

该原则提出对象不应该承担太多职责,如果一个对象承担了太多的职责,至少存在以下两个缺点:

  1. 一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力;
  2. 当客户端需要该对象的某一个职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码的浪费。

单一职责原则的优点

单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。如果遵循单一职责原则将有以下优点。

  • 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
  • 提高类的可读性。复杂性降低,自然其可读性会提高。
  • 提高系统的可维护性。可读性提高,那自然更容易维护了,而且不容易牵连其他业务。
  • 变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。

迪米特法则(最少知道原则)

一个类应该应该对其他类尽可能了解得最少,并且只与直接的朋友通信

从迪米特法则的定义和特点可知,它强调以下两点:

  • 从依赖者的角度来说,只依赖应该依赖的对象。
  • 从被依赖者的角度说,只暴露应该暴露的方法。

数据使用类,数据加载类,多个方式的具体获取数据

使用类和获取类是好朋友,获取类跟获取方式数据类是好朋友

DataConfig LoadConfig MysqlDataSource/RedisDataSource

配置中心需要通过配置加载类获取最新数据,但是配置加载类需求借由数据库或者Redis去真正实现获取数据

千万不要在DataConfig 直接调用 MysqlDataSource/RedisDataSource

参考链接1

参考链接2

接口分离原则

接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分多个

当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。
在使用接口隔离原则时,我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护。接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。

合成复用原则

要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

通常类的复用分为继承复用和合成复用两种,继承复用虽然有简单和易实现的优点,但它也存在以下缺点。

  1. 继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。
  2. 子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。
  3. 它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。

采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,它有以下优点。

  1. 它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
  2. 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。
  3. 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。

合成复用原则的实现方法

合成复用原则是通过将已有的对象纳入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能,从而达到复用。

总结

开闭原则 对扩展开放,对修改封闭,面向接口编程

里氏替换原则 父类出现的地方,子类一样可以使用,子类尽量不要重写或者重载父类方法

依赖倒置原则 面向接口编程,依赖于抽象而不依赖于具体

单一职责原则 一个类只干一件事

迪米特法则 只跟朋友打交道,其他朋友的事情交给我认识的朋友处理吧

接口分离原则 一个接口的所有方法,如果子类不想实现其中的方法,就要拆分多个接口

合成复用原则 优先组合,其次继承

编程七大原则和23种设计模式汇总整理

三大类

创建型模式

共五种

工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

结构型模式

共七种

适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式

行为型模式

共十一种

策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

七大原则

开闭原则(总原则)

对扩展开放,对修改封闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码

实现原理

通过接口,抽象类,把一组相关联或者相似的业务进行抽离出来,定义好方法,编写抽象业务层

通过具体的实现类去实现接口,抽象类,重载接口/抽象类的方法,完成具体业务的实现处理

后期需要扩展新业务,只需要去实现定义好的抽象业务层类,然后编写具体的业务代码,而不去修改已有的实现业务类,从而实现了对扩展开放和修改封闭

里氏替换原则

所有引用基类对象的地方能够透明地使用其子类的对象

原则补充

里氏替换原则是对开闭原则的规范约束

基类可以出现的地方,子类一定可以出现

子类对父类的方法尽量不要重写和重载,会破坏父类定义好的规范和契约

依赖倒置原则

面向接口编程,依赖于抽象而不依赖于具体

写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。

实现原理

// 支付购买商品
Pay pay=new AliPay();
payProduct(pay);

public void payProduct(Pay pay){
 //真正支付的方法,不依赖于具体的实现类,直接调用接口方法
 pay.payMoney();

}

单一职责原则

规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分

该原则提出对象不应该承担太多职责,如果一个对象承担了太多的职责,至少存在以下两个缺点:

  1. 一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力;
  2. 当客户端需要该对象的某一个职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码的浪费。

单一职责原则的优点

单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。如果遵循单一职责原则将有以下优点。

  • 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
  • 提高类的可读性。复杂性降低,自然其可读性会提高。
  • 提高系统的可维护性。可读性提高,那自然更容易维护了,而且不容易牵连其他业务。
  • 变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。

迪米特法则(最少知道原则)

一个类应该应该对其他类尽可能了解得最少,并且只与直接的朋友通信

从迪米特法则的定义和特点可知,它强调以下两点:

  • 从依赖者的角度来说,只依赖应该依赖的对象。
  • 从被依赖者的角度说,只暴露应该暴露的方法。

数据使用类,数据加载类,多个方式的具体获取数据

使用类和获取类是好朋友,获取类跟获取方式数据类是好朋友

DataConfig LoadConfig MysqlDataSource/RedisDataSource

配置中心需要通过配置加载类获取最新数据,但是配置加载类需求借由数据库或者Redis去真正实现获取数据

千万不要在DataConfig 直接调用 MysqlDataSource/RedisDataSource

参考链接1

参考链接2

接口分离原则

接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分多个

当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。
在使用接口隔离原则时,我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护。接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。

合成复用原则

要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

通常类的复用分为继承复用和合成复用两种,继承复用虽然有简单和易实现的优点,但它也存在以下缺点。

  1. 继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。
  2. 子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。
  3. 它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。

采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,它有以下优点。

  1. 它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
  2. 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。
  3. 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。

合成复用原则的实现方法

合成复用原则是通过将已有的对象纳入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能,从而达到复用。

总结

开闭原则 对扩展开放,对修改封闭,面向接口编程

里氏替换原则 父类出现的地方,子类一样可以使用,子类尽量不要重写或者重载父类方法

依赖倒置原则 面向接口编程,依赖于抽象而不依赖于具体

单一职责原则 一个类只干一件事

迪米特法则 只跟朋友打交道,其他朋友的事情交给我认识的朋友处理吧

接口分离原则 一个接口的所有方法,如果子类不想实现其中的方法,就要拆分多个接口

合成复用原则 优先组合,其次继承

赞 (0)

评论区(暂无评论)

这里空空如也,快来评论吧~

我要评论