设计模式之美笔记 - 学习框架

设计模式之美 - 03

设计模式之美【总结】 - 74

编程方法论:面向对象、设计原则、设计模式、编程规范、重构技巧

一、面向对象(可以看成一种设计思想)

因为面向对象编程具有丰富的特性,可以实现很多复杂的设计思路。所以是很多设计原则、设计模式等编码实现的基础。

面向对象编程中有两个非常重要、非常基础的概念,那就是类(class)和对象(object)。

1、面向对象编程语言 和 面向对象编程 的区别:

  • 面向对象编程 是一种编程范式或编程风格。面向对象编程是以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石 。
  • 面向对象编程语言 是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。

2、面向对象编程主要知识点:

  1. 面向对象的四大特性:封装、抽象、继承、多态   【
    封装用于隐藏信息,保护数据;
    抽象用于隐藏方法具体实现(通过抽象类或者接口来实现);
    继承:子类继承父类,强调的从属关系,但是会造成强耦合;
    多态:指的是子类可以代替父类。提高代码的可复用性和可扩展性,多态也是很多设计模式、设计原则、编程技巧的代码实现基础,比如策略模式、基于接口而非实现编程、依赖倒置原则、里式替换原则、利用多态去掉冗长的 if-else 语句等等。】
  2. 面向对象编程与面向过程编程的区别和联系
    面向过程编程:面向过程风格是一种流程化的编程风格,通过拼接一组顺序执行的方法来操作数据完成一项功能。
     
  3. 面向对象分析、面向对象设计、面向对象编程:
     
  4. 接口和抽象类的区别以及各自的应用场景:
     
  5. 基于接口而非实现编程的设计思想:
     
  6. 多用组合少用继承的设计思想:
     
  7. 面向过程的贫血模型和面向对象的充血模型:
    贫血模型就是数据和操作分开,充血模型就是数据和操作封装在一个类中。
    领域驱动设计(DDD) 基于充血模型

3、面向对象分析,面向对象设计,面向对象编程,正好是面向对象软件开发要经历的三个阶段。

面向对象分析和面向对象设计:就是围绕着对象或类来做需求分析和设计的。

  • 分析:做什么;
  • 设计:怎么做;
  • 编程:将分析和设计的的结果翻译成代码的过程。

二、设计原则

设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有指导意义。比如,“开闭原则”是很多设计模式(策略、模板等)的指导原则。

常用的几个原则:

  • SOLID 原则 -SRP 单一职责原则
  • SOLID 原则 -OCP 开闭原则
  • SOLID 原则 -LSP 里式替换原则
  • SOLID 原则 -ISP 接口隔离原则
  • SOLID 原则 -DIP 依赖倒置原则
  • DRY 原则、KISS 原则、YAGNI 原则、LOD 法则

 

三、设计模式

大部分设计模式要解决的都是代码的可扩展性问题。是软件开发过程中设计问题的解决方案或者设计思路。相比于设计原则更为具体。

经典的设计模式有 23 种,这些设计模式可以分为三大类:创建型、结构型、行为型。设计模式要干的事情就是解耦。

  1. 创建型设计模式主要解决“对象的创建”问题,创建型模式是将创建和使用代码解耦
  2. 结构型设计模式主要解决“类或对象的组合或组装”问题,结构型模式是将不同功能代码解耦
  3. 那行为型设计模式主要解决的就是“类或对象之间的交互”问题。行为型模式是将不同的行为代码解耦
     

 

1、创建型 :主要解决“对象的创建”问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。

常用的有:

  1. 单例模式:通过私有的构造函数实现,保证其无法被实例化;创建全局唯一的对象
  2. 工厂模式:(简单工厂  和  工厂方法)工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。
  3. 建造者模式:建造者模式是用来创建复杂对象,可以通过设置不同的可选参数,“定制化”地创建不同的对象
    使用场景:实例化对象的时候,入参过多,并且存在一定的校验逻辑,那么就需要在类中增加内部类来完成赋值,校验,然后进行对象创建
    例如可配置的资源池。可选入参比较多,并且如参间存在相互关系需要进行校验

不常用的有:

  1. 原型模式:

2、结构型:主要解决“类或对象的组合或组装”问题,将不同功能的代码进行解耦

常用的有:

  1. 代理模式:用于在业务系统中,开发一些非功能性需求。 在不改变原始类代码的情况下,通过引入代理类来给原始类添加附加功能。代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它跟装饰器模式最大的不同
  2. 桥接模式:一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展; 使用举例 : 不同等级的通知,通过不同等级的通知方式。
  3. 装饰器模式:解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。装饰器类需要跟原始类继承相同的抽象类或者接口。
  4. 适配器模式:解决接口不兼容问题

不常用的有:

  1. 门面模式:解决性能问题,解决接口易用性,解决分布式事务
  2. 组合模式:数据能表示成树形结构、能通过树的遍历算法来解决的场景中
  3. 享元模式:享元模式在 Integer 和 String的自动装箱 和 valueOf中的应用(Integer 的常量  和 String 的常量池)

符合组合模式的设计模式有:代理模式,桥接模式,装饰者模式

  • 代理模式,附加与原始类无关的功能
  • 装饰者模式,附加与原始类相关的增强功能

3、行为型:主要解决的就是“类或对象之间的交互”问题,将不同行为的模式进行解耦。

常用的有:

  1. 观察者模式在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。应用场景:用户昨晚健康测评以后,会触发用药,运动和饮食等计划生成。通过EventBus、AsyncEventBus实现同步阻塞或者异步非阻塞的监听者模式
  2. 模版模式在一个方法中定义一个算法骨架(指的是广义上的“业务逻辑”),并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。模板模式主要是用来解决 复用 和 扩展 两个问题,常用于框架的开发中。通过继承同一个抽象类来完成,模版方法声明称final
  3. 策略模式定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。从而避免冗长的if-else或switch判断。订单系统中,对于不同类型的DMS消息存在不同的模型转换和处理的策略类。所有的策略类实现统一的接口
  4. 职责链模式多个处理器处理同一个请求,处理器A完成处理后,把请求交给处理器B,处理器B处理完成后,将请求处理给C,以此类推,链条上的每个处理器各自承担各自的处理职责,所以叫作职责链模式。可用模版模式来实现
  5. 迭代器模式:迭代器模式。它用来遍历集合对象。不过,很多编程语言都将迭代器作为一个基础的类库,直接提供出来了。在平时开发中,特别是业务开发,我们直接使用即可,很少会自己去实现一个迭代器。例如遍历list使用的迭代器。
  6. 状态模式:

模版模式和策略模式的区别:

模版模式:通过extends的方式来解决代码的 扩展与复用,通过final来定义模版方法,通过abstract来定义需要延迟到子类中实现的方法。模版模式强调的是一个从属关系,所提供的方法不得超出父类的定义外围

策略模式:通过implement 的方式来使用接口实现算法的变化独立于客户端。

不常用的有:

  1. 访问者模式
  2. 备忘录模式
  3. 命令模式
  4. 解释器模式
  5. 中介模式

 

四、代码重构

重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编码规范这些理论。

1、重构的目的(why)、对象(what)、时机(when)、方法(how);

2、保证重构不出错的技术手段:单元测试和代码的可测试性;

3、两种不同规模的重构:大重构(大规模高层次)和小重构(小规模低层次)。

 

五、编程规范

代码实现的小细节。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值