设计模式——设计原则综述

学习资料为设计模式第二版,清华大学出版社,在此记录学习笔记

设计原则概述

每个设计模式都符合一个或多个设计原则,这些设计原则旨在提高软件的可维护性和可复用性

维护性较低的软件特点

  1. 过于僵硬:添加功能涉及很多模块,需要进行较大改动,存在大量硬编码等问题
  2. 过于脆弱:修改某些代码会导致不相关功能出现故障。
  3. 复用率低:软件组成部分很难重用
  4. 粘度过高:系统原始的设计意图和设计框架使得程序员破坏这些意图和框架更易完成功能的实现代表该系统粘度过高。

好的系统设计特质

  1. 可扩展性: 很容易将新功能加入现有系统
  2. 灵活性:代码修改不会涉及很多其他模块
  3. 可插入性:类能很方便的出抽取并插入相应功能的接口

重构

在不改变系统现有功能的情况下调整代码改善软件的质量、性能,使其程序的设计模式和架构更加合理,提供软件的扩展性和维护性。

单一职责原则:类的职责要单一,不要将太多的职责放在一个类中

类的职责要单一,其承担的职责越多,被复用的可能性越小,类中过多职责相当于将职责耦合,当另一个系统需要调用相应方法无法直接复用(高层次复用),只能粘贴部分代码。但如果多个职责总是同时发生变化,也可以将他们封装在同一个类中。

单一职责原则是实现高内聚,低耦合的指导方针。

开闭原则:一个软件的实体应当对扩展开放,对修改关闭。即设计模块时应该使该类能在不被修改的前提下被扩展(不修改源代码修改类的行为)

特点:灵活,可拓展

关键:抽象到具体

在软件面临新需求时,我们应保证系统的设计框架是稳定的,而符合开闭原则的软件系统能在不修改代码的情况下对软件进行拓展,就能兼具灵活性、适应性的情况下具备稳定性和延续性。

为了满足开闭原则,要对系统进行抽象化设计,抽象化是开闭原则的关键。为系统定义一个相对稳定的抽象层,将不同实现行为在具体实现层中完成。修改系统行为不需要改动抽象层,只需要增加具体类实现新的业务功能即可。通过这种不修改代码而实现功能拓展,达到开闭原则的要求。

后面的里氏代换原则、依赖倒转原则都是开闭原则的实现方法。

里氏代换原则:每一个引用基类(父类)的地方都能透明地(不引起变化地)使用其子类对象

里氏代换是实现开闭原则的重要方式之一。在定义时尽量使用其基类类型对对象进行定义。运行时再确定其子类类型,用子类对象代替父类。

注意事项:

  • 子类中所有方法都要在父类中声明,子类也必须实现父类所有方法,否则该方法无法在父类对象中被使用。
  • 父类尽量设计为接口或抽象类被子类集成或实现,这样能很方便实现功能拓展。

依赖倒转原则:面向接口编程(高层模块不应该依赖低层模块,而应该都依赖抽象)

依赖倒置原则要求代码要依赖于抽象的类而不是具体的类,一个具体类中应当只实现接口和抽象类中声明过的方法。

依赖倒转原则要求客户端依赖于抽象耦合(抽象耦合指抽象类和抽象类或抽象类和具体类之间的实例引用关系),抽象耦合是依赖倒转原则的关键。

依赖注入:将一个类的对象传入另一个类中(注入时尽量注入父类对象,运行时再用子类覆盖父类),分别有构造注入(在构造方法中注入),设值注入(setter方法中注入)和接口注入(通过接口方法注入实例对象)

接口隔离原则:将大接口进行细化,用多个专门接口替换单一总接口

这里的接口可以理解为具有发放特征的集合(即角色,也可以理解为角色隔离原则)

接口隔离原则拆分接口时要满足单一职责原则,将相关操作封装在一个接口中,在满足高内聚的前提下,接口中的方法越少越好

接口不能太小,否则会造成接口泛滥,难以管理。也不能太大,太大则违反了接口隔离原则,灵活性差。总而言之,接口中应该只包含某一类用户定制的方法。

合成复用原则:为了降低类中的耦合度,应该倡导多用关联关系,少用继承关系。

继承会破坏系统的封装性,同时基类修改时子类也被迫修改。没有足够的灵活性

而组合则可以让成员对象内部细节对新对象不可见,成员对象修改时对新对象的影响也很小,耦合度低于继承。

迪米特法则:降低系统的耦合度,类与类之间保持松散的耦合关系。

一个类的朋友只有

  • 对象本身(this)
  • 以参数形式传入当前对象方法的对象
  • 当前对象的成员对象
  • 若当前对象的成员对象是集合,那么集合的元素也都是朋友
  • 当前对象所创建的对象

其他都是“陌生人”。

广义迪米特强调信息隐藏的控制,将各个子系统脱耦,允许他们被独立的开发,优化,使用,修改。

迪米特法则要求一个软件实体应当尽可能少地与其他实体发生相互作用

应用迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系

  1. 迪米特法则分析
    • 迪米特法则要求在设计系统时,应该尽量减少对象之间的交互
    • 如果两个对象之间不必彼此直接通信,那么这两个对象就不应该发生任何直接的相互作用
    • 如果其中一个对象需要调用另一个对象的方法,可以通过“第三者”转发这个调用
    • 通过引入一个合理的“第三者”(中间类)来降低现有对象之间的耦合度

根据迪米特法则,变成如下形式(外观模式是经典的迪米特法则模式)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值