设计模式-装饰器模式
问题描述 装饰器是python语言中相当重要的一部分. 但装饰器本身并不是python都有的东西. 只是一种设计模式, 本质上可以由任何语言实现. 假设在HTMLDocument类中有一个方法, 可以接收一个文本文本文件, 并用<div>标签将其包裹并放在html文件中. classDiagram class HTMLDocument{ + inse...
问题描述 装饰器是python语言中相当重要的一部分. 但装饰器本身并不是python都有的东西. 只是一种设计模式, 本质上可以由任何语言实现. 假设在HTMLDocument类中有一个方法, 可以接收一个文本文本文件, 并用<div>标签将其包裹并放在html文件中. classDiagram class HTMLDocument{ + inse...
应用场景 适配器模式属于比较常见且比较容易理解的设计模式. 老话说的好, 0.5的铅芯是不能用在0.7的自动笔里的. 当在项目里为了实现某些功能并应用某种设计模式, 或其他什么原因需要设计一些接口, 而这些接口的实现类要做的具体业务需要依赖于某个外部项目. 比如需要再自己的项目中加入图片处理的一些功能. 需要用到开源的图像处理库. 再比如在处理数据库ORM的时候针对不同的数据库需要有...
应用场景 在使用类似于PowerPoint, Keynot等软件时经常会处理一些简单的图形, 或者具有关联关系的各种元素.通常情况下, 我们会把他们放入一个组中. 之后在对组进行操作的时候, 比如移动, 缩放一类的, 组中的所有元素就会一同执行这些操作. 又或者文件夹和文件的关系, 在复制, 移动, 删除文件夹的时候其中的所有文件都会被一同操作. 当在程序中处理类似问题的时候可以通过...
应用场景 访问者模式最常见的应用场景在于对已有功能的扩展. 假设有这样一套类: classDiagram class HTMLNode{ <<interface>> get_text() highlight() } class DIV{ get_text() h...
应用场景 相当于为一项任务创建一条流水线, 类似于django的中间件等功能都是采用责任链模式来完成的. 即接到一个任务时, 不同的对象处理完自己的部分任务, 然后将其交给下一个对象一次处理. 类似于HttpRequest请求, 可能包含: 登录验证 权限验证 IP验证 一系列验证 处理请求 返回结果 责任链模式的好处在于每一个处理任务之间彼此独立, 相...
应用场景 迭代器用于对数据的遍历. 最主要的作用便是对外界隐藏内部的数据结构和遍历方式, 只需要暴露一个统一的遍历方法, 从而解耦外部对于自身数据结构的依赖. 即便在内部修改数据结构或者实现方式也不会对外部代码产生影响. 假设一个需求, 存在一个数据集, 按照表的形式存储数据. 即包含多行数据, 每行包含数个数据列. 在外部需要对表格内的数据进行遍历. 每次仅获取一个单元格的数据, 从...
应用场景 通常用于多个元素之间的统一通信调度. 举例来说, 一个用户界面拥有多个类型的UI: ListBox TextBox button 当选中listbox中的项时同步修改textbox中的文字. 而当textbox中包含文字时按钮可用, 当textbox中的文字为空时按钮不可用. classDiagram note for ListBox "select...
应用场景 类似于图表的应用场景, 有一个包含原始数据的表格, 以及一张基于表格内的数据绘制的图表. 当表格内的数据发生变动时, 图表就应该给予数据进行重绘. 观察者模式就是设置一个对原始数据的观察者, 当原始数据发生变动时, 由观察者负责通知所有依赖这些数据运行的其他对象发生了变动以及具体的变动内容. classDiagram note for Subject "定义添加,删...
应用场景 假设在编写一个UI框架, 框架中包含一个按钮对象Button, 当点击按钮时则会执行一些指令. 为了能够实现框架与功能的解耦, 通常便会使用命令模式. 按钮点击时会调用命令接口的执行命令 实现接口的对象则依靠多态指派 实现接口的实际指令对象仅负责将指令派发至具体的功能实现类 最终由实现类完成指令 classDiagram class Button...
应用场景 在处理一些大致内容相同, 但是有些细微差距的问题时可以使用模板方法模式. 基于同一套模板下, 不同的具体实现只针对细节发生变化, 而其他的内容则是依照父类模板执行. 举例来说, 一个代驾司机的标准工作流程大致可分为: 接单 到达指定车主位置 代驾到指定目的地 收钱 要好评,再见~ 那么区别在哪? 在于面对不同级别的车子时的心理状态~ 顶级豪车得毕恭...