六大设计原则

重点

  1. 开闭原则
  2. 里氏替换原则
  3. 依赖倒转原则
  4. 接口隔离原则
  5. 迪米特法则
  6. 合成复用原则

开闭原则

  对扩展开放,对修改关闭。

  开闭原则要求在设计类时使用接口或抽象类,具体的实现交给实现类或子类。 当需要改变实现时,不应该修改代码,而是扩展出一个新的实现类。不修改代码表示不去修改已经写好的实现类和接口/抽象类,但不修改接口/抽象类的前提是已经合理地定义了接口/抽象类,如果没有合理地定义接口/抽象类则该改还是要改。

  不遵循开闭原则,在设计时直接用实现类,那么当需要改变这个类已经实现了的功能时,就需要修改这个类,甚至是修改所有依赖这个类的其他类。

  开闭原则的运用方法不止扩展类这一种用法,只要程序设计满足对扩展开放对修改关闭就是在运用开闭原则。比如,通过动态代理去扩展类的功能也是运用开闭原则的一种方式。

里氏替换原则

  任何可以使用基类的地方,一定也可以使用子类。

  ​里氏替换原则要求子类可以扩展父类的功能,但不能改变父类的功能。 在此规则下,父类中实现的是子类们的公共方法,子类不要去重写父类中的方法实现功能,而是扩展实现自己特有的方法。

  ​如果父类要求子类必须重写方法,则需要在父类中定义成抽象方法。

  ​如果两个类之间无法满足里氏替换原则,就不要用继承关系,可以考虑用组合或聚合关系。

依赖倒转原则

  高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。

  依赖倒转的中心思想是面向接口编程,因为相对于细节的多变性,抽象的东西要稳定得多。

  具体来说,当我们在代码中传递参数或搭建关联关系时,尽量引用层次高的抽象层类,也就是尽量使用接口和抽象类代替具体类来进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,尽量不要用具体类来做这些事情。

  在定义模块时依赖抽象,在使用模块时才传入具体类的对象。

接口隔离原则

  使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

  接口隔离原则是对如何定义接口的规范,在此规则下接口应该定义得尽量小。

  在创建实现类时实现于多个接口都好过于实现不需要的方法。

迪米特法则

  迪米特法则又最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用。

  如果一个系统满足迪米特法则,那么当其中一个软件实体发生变化时,就会尽量少的影响其他软件实体,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可以降低系统的耦合度,使类与类之间保持松耦合状态。

  迪米特法则还有几种定义形式,其中就包括不要和"陌生人"说话、只与你的直接朋友通信,这里的朋友指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。

合成复用原则

  尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

  通常类的复用分为继承复用和合成复用两种。

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

  采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,它有以下优点:
    它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为 “黑箱”复用
​    对象间的耦合度低。可以在类的成员位置声明抽象,在运行时传入具体对象。
    复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值