设计模式之禅_6大设计原则

本文深入探讨软件设计的六大核心原则:单一职责、里氏替换、依赖倒置、接口隔离、迪米特法则及开闭原则,解析每项原则的定义、实践与应用,助您提升软件架构水平。

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

单一职责原则

定义

应该有且只有一个原因引起类的变更

里氏替换原则

定义

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

如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。

四个原则:
1. 子类必须完全实现父类的方法
2. 子类可以有自己的个性
3. 覆盖或实现父类的方法时,输入参数可以被放大
4. 覆盖或实现父类方法时,输出结果可以被缩小

最佳实践

采用里氏替换原则时,尽量避免子类的“个性”,因为当把子类当做父类使用时,子类的“个性”被抹杀,如果子类单独来使用,又不能发挥继承的多态特性。

依赖倒置原则

在java中的表述是:(抽象:接口或者抽象类;细节:抽象的实现类)
1. 模块之间的依赖通过抽象发生,实现类之间不发生直接的依赖关系
2. 接口和抽象类不依赖实现类
3. 实现类依赖抽象类或接口
简而言之:面向接口编程

依赖的方式

  1. 构造函数传递依赖对象。通过构造函数声明依赖对象,构造函数注入。
  2. setter方法传递依赖对象。在抽象中设置setter方法声明依赖关系,就是setter依赖注入
public interface A{
    public void setB(B foo);//B是依赖的对象,B也可能是抽象
    ...
}
  1. 接口声明依赖对象。在接口的方法中声明依赖对象
public interface A{
    public void function(B foo);
    ...
}

最佳实践

  1. 每个类尽量都有接口或抽象类。抽象是实现依赖倒置的前提
  2. 变量的表面类型尽量是抽象。即使用细节来实例化抽象对象
  3. 任何类都不应从具体类派生
  4. 尽量不要覆写基类已经实现的方法。如AbstractCollection
  5. 结合里氏替换原则使用。接口负责定义public属性和方法,并且声明与其他对象的依赖关系,抽象类负责公共构造部分的实现,实现类准确的实现业务逻辑,同时在适当的时候对父类进行细化最好的例子是java的util包

总结

倒置是指抽象间的依赖关系,而不是细节之间的依赖关系(我们把细节的依赖提高到抽象间的依赖,提升了依赖的层次,实现了倒置)。

依赖倒置是6个设计原则中最难实现的原则,是实现开闭原则的重要途径,依赖倒置原则没有实现,就别想实现对扩展开放,对修改关闭。

接口隔离原则

定义:
1. 客户端依赖他不需要的接口
2. 类间的依赖关系应该建立在最小的接口上

接口隔离原则要求接口的方法尽量的少,不应该建立大而全的接口,应该是小而精。即便接口遵循了单一职责原则,也应该分析方法的内联性,拆分大的接口,使其成为几个遵循单一职责原则的小接口。

最佳实践

  1. 一个接口只服务于一个子模块或业务逻辑
  2. 通过业务逻辑压缩接口中的public方法
  3. 已经被污染的接口尽量去修改,如果变更风险大,用适配器模式进行转化

迪米特法则

一个对象应该对其他对象有最少的了解。

一个类只和朋友类交流,不与陌生类交流。类与类之间的关系建立在类间的,而不是方法间。(朋友类:出现在成员变量、方法的输入输出参数中的类。而出现在方法体内部的类不属于朋友类)因此,一个业务类或模型类的方法中尽量不要出现其他业务类或模型类实例,应该传参实现。

开闭原则

一个软件实体如类、模块和函数应该对外扩展开放,对修改关闭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值