设计模式之七大原则

👑单一职责原则

单一职责原则告诉我们一个类应该只有一个责任或者只负责一件事情。

想象一下,如果一个类承担了太多的责任,就像一个人同时负责做饭、洗衣服和打扫卫生一样,那么这个类会变得非常复杂,难以理解和维护。而且,当需要修改其中一个功能时,可能会影响到其他功能,导致意想不到的问题。

通过遵循单一职责原则,我们可以将一个复杂的类拆分成多个小的、具有独立职责的类。每个类只关注自己的职责,这样代码会更加清晰、易于理解和修改。

举个例子,假设我们有一个User类,它既负责用户的登录验证,又负责用户信息的管理。按照单一职责原则,我们可以将这个类拆分成两个类:一个负责用户的登录验证,另一个负责用户信息的管理。这样,当我们需要修改登录验证逻辑时,就不会影响到用户信息的管理部分。

总结起来,单一职责原则的核心思想是:一个类应该只有一个责任,这样可以提高代码的可读性、可维护性和可扩展性。

👑里氏替换原则

里氏替换原则指导我们如何设计和使用继承关系 。简单来说,里氏替换原则告诉我们,子类对象可以替换父类对象出现在任何能使用父类对象的地方,而不会产生错误或者破坏程序的正确性

举个例子,假设有一个动物类Animal,其中有一个方法叫做makeSound(),用于发出动物的声音。然后我们派生出了两个子类Cat和Dog,它们都继承自Animal类。按照里氏替换原则,我们可以在任何需要Animal对象的地方使用Cat或Dog对象,比如调用makeSound()方法。

具体到代码实现上,如果Cat和Dog类分别实现了自己的makeSound()方法,那么无论是Animal类型的变量还是Cat、Dog类型的变量,都可以调用makeSound()方法,而且得到的结果应该符合预期。

总结起来,**里氏替换原则的核心思想是:子类对象应该能够替换父类对象,而不会引起任何错误或异常。**这样设计出来的代码更加灵活、可扩展,并且易于维护。

👑开闭原则

开闭原则告诉我们软件实体(类、模块、函数等)应该对扩展开放,对修改关闭

**开闭原则的核心思想是:当需要改变一个系统的行为时,我们应该尽量通过添加新的代码来实现,而不是修改已有的代码。**这样做的好处是,我们可以保持已有的代码稳定性,减少引入新错误的风险。

举个例子,假设我们有一个电商网站,其中有一个购物车类Cart,用于管理用户的购物车信息。现在,我们需要添加一个新的功能,比如优惠券折扣。按照开闭原则,我们应该创建一个新的类DiscountCoupon,并且让它负责计算折扣金额。然后,在Cart类中,我们可以通过调用DiscountCoupon类的方法来获取折扣金额,而不是直接修改Cart类的代码。

这样做的好处是,如果以后我们需要添加其他类型的折扣,比如满减或者赠品,我们只需要创建相应的类,并且确保它们都符合同一个抽象接口。这样,我们可以轻松地扩展系统的功能,而不需要修改已有的代码。

总结起来,**开闭原则的目标是让我们能够通过扩展来改变一个系统的行为,而不需要修改已有的代码。**这样可以提高代码的稳定性、可维护性和可扩展性。

👑依赖倒转原则

依赖倒转原则告诉我们高层模块不应该依赖于低层模块,而是应该依赖于抽象。

通俗地说,依赖倒转原则就是要求我们在设计代码时,尽量使用抽象类或者接口来进行编程,而不是直接依赖具体的实现类。这样做的好处是,可以降低模块之间的耦合度,提高代码的灵活性和可维护性。

举个例子,假设我们有一个电商网站,其中有一个Order类用于处理订单相关的逻辑。按照依赖倒转原则,我们应该定义一个抽象的Payment接口,然后让Order类依赖于这个接口。具体的支付方式,比如支付宝、微信支付等,都应该实现这个接口,并且提供自己的具体实现。

这样做的好处是,当我们需要更换支付方式时,比如从支付宝切换到微信支付,我们只需要创建一个新的实现类,并且修改配置文件或者注入相应的实例即可,而不需要修改Order类的代码。这样,我们可以轻松地扩展和变更系统的功能,而不会对其他模块产生影响。

总结起来,**依赖倒转原则的核心思想是:高层模块不应该依赖于低层模块,而是应该依赖于抽象。**通过使用抽象类或者接口来编程,可以降低模块之间的耦合度,提高代码的灵活性和可维护性。

👑接口隔离原则

接口隔离原则告诉我们客户端不应该依赖于它不需要的接口

通俗地说,**接口隔离原则就是要求我们将庞大而臃肿的接口拆分成更小、更具体的接口,以满足客户端的精确需求。**这样做的好处是,可以降低客户端与接口之间的耦合度,提高代码的灵活性和可维护性。

举个例子,假设我们有一个电商网站,其中有一个Product类用于处理商品相关的逻辑。按照接口隔离原则,我们应该将Product类的接口拆分成多个更小的接口,比如IProductInfo和IProductReview。这样,客户端只需要依赖于它们所需的接口,而不需要依赖整个Product类的接口。

这样做的好处是,当我们需要在客户端中使用商品信息时,只需要实现IProductInfo接口即可,而不需要关心其他不需要的方法。同样,当我们需要在客户端中使用商品评价时,只需要实现IProductReview接口即可。

通过接口隔离原则,我们可以避免客户端依赖于不需要的接口,减少了对无用方法的依赖,提高了代码的可读性和可维护性。同时,接口隔离原则也促进了代码的复用,因为我们可以根据需要选择实现不同的接口。

总结起来,接口隔离原则的核心思想是:客户端不应该依赖于它不需要的接口。通过拆分庞大的接口,只提供客户端所需的精确接口,可以降低耦合度,提高代码的灵活性和可维护性

👑迪米特法则

迪米特法则,也被称为最少知识原则,它告诉我们一个对象应该尽量减少与其他对象之间的交互,只与直接的朋友进行通信。

通俗地说,**迪米特法则就是要求我们在设计代码时,尽量降低对象之间的耦合度,避免一个对象过多地了解其他对象的内部细节。**这样做的好处是,可以提高代码的可维护性和灵活性,减少对其他对象的依赖。

举个例子,假设我们有一个电商网站,其中有一个Order类用于处理订单相关的逻辑。按照迪米特法则,我们应该尽量减少Order类与其他类的直接交互,只与必要的对象进行通信,比如与Product类、Payment类等直接相关的对象。

这样做的好处是,当需要修改或者扩展系统的某个功能时,我们只需要关注与之直接相关的对象,而不需要考虑其他无关的对象。这样可以降低代码的复杂度,提高代码的可读性和可维护性。

另外,迪米特法则还鼓励使用中间对象来协调其他对象之间的交互,以减少对象之间的直接依赖关系。这样可以提高系统的灵活性,降低耦合度。

总结起来,**迪米特法则的核心思想是:一个对象应该尽量减少与其他对象之间的交互,只与直接的朋友进行通信。**通过降低对象之间的耦合度,可以提高代码的可维护性和灵活性,减少对其他对象的依赖。

👑合成复用原则

合成复用原则告诉我们在设计代码时,应该优先使用组合(composition)而不是继承(inheritance)来实现复用。

通俗地说,**合成复用原则就是要求我们通过将已有的类组合起来,构建新的类来实现复用,而不是通过继承已有的类。**这样做的好处是,可以减少类之间的耦合度,提高代码的灵活性和可维护性。

举个例子,假设我们有一个电商网站,其中有一个Order类用于处理订单相关的逻辑。按照合成复用原则,我们应该优先使用组合来实现订单的功能,而不是通过继承已有的类。

具体来说,我们可以定义一个Order类,然后在该类中使用其他已有的类,比如Product类和Payment类,作为其成员变量。这样,Order类就可以通过调用这些成员变量的方法来实现自己的功能,而不需要继承这些类。

这样做的好处是,当我们需要修改或者扩展系统的某个功能时,只需要关注与之相关的类,而不需要影响到其他类。同时,由于使用了组合而不是继承,我们可以更加灵活地选择和替换成员变量,以满足不同的需求。

总结起来,**合成复用原则的核心思想是:优先使用组合而不是继承来实现复用。**通过将已有的类组合起来构建新的类,可以降低耦合度,提高代码的灵活性和可维护性。

相关推荐
bobostudio19952 小时前
TypeScript 设计模式之【策略模式】
前端·javascript·设计模式·typescript·策略模式
ok!ko5 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
拉里小猪的迷弟7 小时前
设计模式-创建型-常用:单例模式、工厂模式、建造者模式
单例模式·设计模式·建造者模式·工厂模式
严文文-Chris9 小时前
【设计模式-中介者模式】
设计模式·中介者模式
刷帅耍帅9 小时前
设计模式-中介者模式
设计模式·中介者模式
刷帅耍帅9 小时前
设计模式-组合模式
设计模式·组合模式
刷帅耍帅10 小时前
设计模式-命令模式
设计模式·命令模式
码龄3年 审核中11 小时前
设计模式、系统设计 record part03
设计模式
刷帅耍帅11 小时前
设计模式-外观模式
设计模式·外观模式
刷帅耍帅11 小时前
设计模式-迭代器模式
设计模式·迭代器模式