一个设计模式的要素
1.模式名称:帮助记忆交流和思考
2.问题:在何时使用设计模式
3.解决方案:设计的组成部分,相互关系和各自的职责和协作方式
还可以细分成
结构:说明对象间的协作关系
参与者:设计模式中的类和对象以及他们各自的职责
协作:参与者怎么协作以实现他们的职责
4.效果:描述模式应用的效果及使用模式应权衡的问题
5.已知应用和相关模式
在一定的抽象层次上描述问题,是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。
设计模式确定了所包含的类和实例,他们的角色,协作方式以及职责分配,每一个设计模式都集中于一个特定的面向对象的设计问题或者设计要点。
MVC设计模式 模型/视图/控制器
分离视图和模型,通过对象间的通信来交换信息。
视图可以嵌套,形成组合视图。
根据两个准则对设计模式进行分类:
目的准则:模式是用来完成什么工作的
1.创建型:与对象的创建有关
2.结构型:处理类或者对象的组合
3.行为型:对类或者对象怎么样交互和怎样分配职责进行描述
范围准则:模式主要是运用于类还是对象
1.类模式主要处理类和子类之间的关系,这些关系通过继承来建立,在编译期间就决定了,是静态的
2.对象模式处理对象间的关系,可以在运行时候变化,是动态的。
目的 | ||||
创建型 | 结构型 | 行为性 | ||
范围 | 类 | factory method | adapter |
Interpreter template method |
对象 | abstract factory
builder prototype singleton |
adapter(对象)
bridge composite decorator facade flyweight proxy |
chain of responsibility
command iterator mediator memento observer state strategy visitor |
设计模式解决问题的方法
1.寻找合适的对象
2.决定对象的粒度
3.指定对象的接口
设计模式主要通过确定接口的主要组成成分以及经接口发送的数据类型来帮助你定义接口
也规定了接口之间的关系
4.描述对象的实现
1)类继承和接口继承:类继承根据一个对象的实现定义了另一个对象的实现,代码和表示的共享机制。
接口继承(子类型化)描述了一个对象什么时候能被用来替代另一个对象。
2)对接口编程而不是对实现编程
不将变量声明为某个特定的具体类的实例对象,而是让他遵循抽象类所定义的接口。
5.运用复用机制
1)类继承:通过生成子类的复用可以称为白箱复用,父类的内部结构对子类可见
2)对象组合:要求对象具有良好的接口,也叫黑箱复用,对象内部不可见
继承是在编译时就已经确定,无法动态改变,子类和父类的耦合关系很紧密,父类中实现的变化都会导致子类的变化。
组合是通过获得对其他对象的引用而在运行时候动态定义,要求对象间彼此遵守接口约定。较少的依赖关系,保持继承的层次有较小的规模。
优先使用对象组合而不是继承。
一般情况下不要创建新的构建,而仅仅是使用现有的构建组合成新的类。
3)委托:是一种组合方法,使委托具有像继承一样的复用能力。接受请求的对象将操作委托给他的代理者
使用继承时,被继承的操作总能引用接受请求的对象。
4)参数化类型:c++中的模板。
在定义一个类型时并不指定该类型所用到的其他所有类型,在使用时以参数的形式提供。
6.关联运行时刻和编译时刻的结构
聚合:意味着一个对象拥有另一个对象或对另一个对象负责。
相识(关联或者引用):一个对象仅仅知道另一个对象,可以请求彼此的操作,但是不为对方负责。比较松散的耦合关系
7.设计应支持变化
怎样选择设计模式
1.考虑设计模式是怎样解决问题的
2.浏览模式的部分意图
3.研究模式怎样互相关联
4.研究目的相似的模式
5.检查重新设计的原因
6.考虑你的设计中那些是可变的
怎样使用设计模式
1.大致浏览一遍设计模式
2.研究结构部分、参与者部分、和协作部分
3.参看代码的实例部分,看这个模式代码具体的应用的例子
4.选择模式参与者的名字,使他们在应用上下文中有意义
**********************************************************************************************
实例研究:一个文档编辑器
一,设计问题
1.文档结构
2.格式化
3.修饰用户界面
4.支持多种视感
5.支持多种窗口系统
6.用户操作
7.拼写检查和连字符
二,文档结构
对字符、线、多边形的一种安排
一致对待文本和图形
不应该过分强调内部表示中单个元素和元素组之间的差别
递归组合:由简单的图形元素构造文档的方法。由字符和图形组成行,由行组成一列,然后由列形成页。。
图元的基本责任:怎么样画出自己,他们占用多大空间,他的父图元和子图元分别是什么
三,格式化
封装格式化算法
为封装格式化算法的对象定义一个compositor类,他的接口可以让compositor获知何时去格式化哪些图元。它所格式化的图元是一个被称为composition的特定图元的各个子图元。
在对象中封装算法是strategy模式的目的,关键在于strategy和它的环境设计足够通用的接口,以支持一系列的算法
四,修饰用户界面
decorator模式:修饰是指给一个对象增加职责的事物。
五,支持多种视感标准
工厂类和产品类:
产品是相同视感的所有窗口组件,有一系列产品类,工厂产生窗口组件图元时要用到。
抽象工厂:不直接使用构造器的情况下创建一系列相关的产品对象。最适用于产品对象的数目和种类不变,而具体产品系列之间存在不同的情况。
通过实例化一个特定的具体工厂对象来选择产品系列,并且以后一直适用该工厂生产产品对象。
抽象工厂模式对产品系列的强调使他区别于其他只与一种产品对象相关的创建型模式。
六,支持多种窗口系统
封装实现依赖关系,对不同的窗口做一个统一的抽象,在对各个窗口系统的实现做一些调整,使之符合公共的接口。
bridge模式,windows类接口针对程序员,而windowsImp接口是针对窗口系统的,将窗口的功能分离到windows和windowsImp中,就可以独立实现这些接口。
允许分离的层次一起工作,即使他们是独立演化的。创建了两个分离的模式,一个支持窗口的逻辑概念一个支持窗口的不同实现。
七,用户操作
封装一个请求,描述了一致性的封装发送请求的接口,允许你配置客户端以处理不同的请求。
该接口保护了用户请求的实现,一个命令可以将所有或者部分的请求实现委托给其他对象,也可以不进行委托。
八,拼写检查和断字处理
封装访问和遍历:通过继承来同意访问不同的数据结构和支持新的遍历方式。
抽象了遍历算法,对客户隐藏了它所遍历对象的内部结构。
封装分析:把一个给定的分析封装在一个类中,并把该类的实例和合适的iterator结合起来使用,iterator负责把该实例携带到所遍历结构的每一个图元中,这样遍历对象可以在每个遍历点做一些分析工作。
访问者类和其子类
遍历过程中访问被遍历对象并做适当操作的一类对象。允许无限扩充分析能力而不会使文档结构的实现复杂化。
原文链接: https://www.cnblogs.com/w0w0/archive/2012/05/17/2506290.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/50514
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!