从哲学角度理解设计模型.pdf——雷灿添

例子1:

把大象装进冰箱分几步:

  • 打开冰箱
  • 把大象放进冰箱
  • 关上冰箱

面向过程:

  • 数据结构:Elephant 大象、Refrigerator 冰箱
  • 函数:openRefrigerator、moveElephant、closeRefrigerator

面向对象:

  • 对象:Elephant、Refrigarator
  • Refrigerator 行为:open、close
  • Elephant 行为:move
  • 调用:newElephant、newRefrigarator,refrigerator.open()、elephant.move()、refirgerator.close()

问题建模:

面向XX编程 -> 对问题的建模方式

具体问题怎么抽象出对象模型:
1、具体问题属于某一层次问题
2、对象模型负责解决这一层次的问题

找到变化,封装变化:

工厂模式:

  • 变化点:创建的对象类型在变化
  • 创建的对象类型在变化,为了隔离变化对调用者的影响,新增一个不变的工厂抽象层,职责是创建对象,以应对变化
    • 不同的产品,客户端要怎么使用?则需要抽象出产品的接口,客户端使用时调用接口层的方法
    • 为了感知类型,则需要往工厂层传入类型:
      • 体现在方法参数中:调用者通过不同的入参,告诉工厂需要哪种类型的产品,工厂再创建对应的产品。这就需要代码中使用 if-else 判断
      • 或者使用不同的方法名做区分:调用者直接调用不同的方法,来创建不同的产品

工厂模式2:

  • 变化点:已有工厂内部在变化
  • (开闭原则,面向修改封闭,面向拓展开放。尽量不要通过修改现有代码来达到拓展的效果,而是通过新增的方式来拓展,比如新增类,或者新增配置文件等)
  • 工厂1缺点:所有产品都在一个工厂创建,如果产品太多,则工厂的复杂度会提高
  • 优化:既然变化的是工厂自身,则参考产品,将工厂抽象出工厂接口,具体的产品在具体的工厂里面生产
  • 实现:
    • 工厂接口层提供统一的生产产品方法,具体的产品工厂去实现自己的产品生产的流程
    • 客户端如果需要具体的产品,则创建对应的工厂,然后让工厂生成对应的产品
    • 客户端的选择不同产品/工厂的操作,完全可以使用配置等方式,将代码变动隔离掉
  • 疑问:那为啥还需要工厂层?直接在客户端创建产品即可
    • 答:创建产品的过程很多时候并不只是简单的new,还需要做依赖装配和初始化等,如果只是简单的new,则可以考虑不使用工厂

模板模式:模板算法在变化,为了适应变化,新增一个不变模板抽象层,通过接口把易变得算法层延迟
到适用再确定

责任链模式:处理流程数量、顺序在变,为了适应变化,新增一个不变抽象层chain,chain封装了所有
处理流程

画出uml,标明稳定、变化部分

找到业务的变化:

找到业务变化就成了运用设计模式最关键的步 骤,离开业务变化谈设计模式那是纸上谈兵

有经验的程序员会首先进行系统的需求分析,先思考是什么,哪里可能会有变化,先把这些问题都想清 楚,再通过抽象思维对问题进行对象建模。先有接口再有实现,先有抽象再有细节,这样做出来的产品 八九不离十

利用xmind 进行系统需求分析:图略

有时候业务比较复杂,变化也没有那么显而易见,无法预测哪里有变化,但是能知道哪里可能有变化
分享:图形建模平台