从哲学角度理解设计模型.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 进行系统需求分析:图略
有时候业务比较复杂,变化也没有那么显而易见,无法预测哪里有变化,但是能知道哪里可能有变化
分享:图形建模平台