DesignPattern(程序设计的指导思想)
文章平均质量分 87
骑在木马上的黑客
纵有疾风起,人生不言弃!
展开
-
命令模式的应用之可撤销/恢复操作的计算器
深度理解命令模式(1)参数化配置:用不同的命令对象,去参数化配置客户的请求。(2)可撤销的操作: ①补偿式(反操作式):如被撤销的操作是加的功能,那么反操作就是减的功能。 ②存储恢复式:把操作前的状态记录下来,然后要撤销操作时就直接恢复回去就可以了。(该种方式会放到备忘录模式中进行讲解)【编程实验】可撤销/恢复操作的计算器//声明文件//****************************...原创 2018-04-20 12:02:42 · 1778 阅读 · 0 评论 -
命令模式的应用之菜单项命令
思考命令模式 ①命令模式的本质:封装请求。这是也命令模式的关键。把请求封装成对象,也就是命令对象,并定义了统一的执行操作的接口。这个命令对象可以被存储、转发、记录、处理、撤销等。整个命令模式都是围绕这个对象进行的。 ②命令模式的动机:在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如需要对行为进行“记录、撤销/重做”、事务”等处理,这种无法抵御变化的紧...原创 2018-04-19 13:10:54 · 1196 阅读 · 0 评论 -
Behavior.Command命令模式:Invoker发送N条Cmd来指示Receiver执行相应的操作
命令模式(Command Pattern)的定义(1)定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 ①封装请求:抽象出需要执行的动作,封装成对象(有统一的接口)。 ②参数化:可以用不同的命令对象,去参数化配置客户的请求。(即,将命令对象作为参数去供Invoker调用)。(2)命令模式的结构和说明 ①Command...原创 2018-04-19 13:06:22 · 424 阅读 · 0 评论 -
职责链模式的应用之模拟JavaWeb的双向过滤器(混合了组合模式)
思考职责链模式 ①职责链的本质:分离职责,动态组合。分离职责是前提,动态组合才是职责链模式的精华所在,因为这意味着可以很方便地修改和添加新的处理对象,从而让系统更加灵活和具有更好的扩展性。 ②职责链的动机:在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时需要有接受者,如果显式指定,将必不可少地带来请求发送者与接受者之间的紧耦合。而职责链模式可以将这两者解耦,使得发送者不必知道...原创 2018-04-19 13:00:51 · 430 阅读 · 0 评论 -
Behavior.ResponsibilityChain职责链模式:义务之内的处理,权力之外的递交
职责链模式(Chain Of Responsibility)的定义(1)定义 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 ①标准的职责链模式中,只要有对象处理了请求,这个请求就到此为至,不再被传递和处理了。 ②但也可以变形使用职责链,就是让这个请求继续传递,每个职责对象对这个请求进行一定的功...原创 2018-04-19 12:56:01 · 323 阅读 · 0 评论 -
代理模式的应用之虚代理实现大对象的延时加载
代理模式的分类(1)虚代理:可以根据需要来创建“大”对象,只有到必须创建对象的时候,虚代理才会去创建对象,从而大大加快程序运行速度,并节省资源。通过虚代理可以对系统进行优化。如开发一个大文档查看软件(如图片100MB),在打开文件前,先显示缩略图,而不是将所有图片都显示出来,在需要查看图片时,再用Proxy来进行大图片的打开)(2)保护代理:可以在访问一个对象的前后,执行很多附加的操作,除了进行权...原创 2018-04-19 12:40:32 · 389 阅读 · 0 评论 -
Structural.Proxy代理模式:挺身而出,控制访问,虚代理
代理模式(Proxy Pattern)的定义(1)为其他对象提供一种代理以控制对这个对象的访问 ①代理模式在客户和被客户访问的对象之间,引入了一定程度的间接性,客户是直接使用代理,让代理来与被访问的对象进行交互。 ②这种附加的间接性增加了灵活性和不同的用途。(2)代理模式的结构和说明 ①Proxy:代理对象,通常实现与具体的目标对象一样的接口,这样就可以使用代理来代替具体的目标对象。 A...原创 2018-04-19 12:35:09 · 189 阅读 · 0 评论 -
享元模式的应用之权限管理系统(混合了组合模式)
使用场景(1)系统中存在大量的相似对象(2)细粒度的对象都具有较接近的外部状态,而且内部状态与环境无关,也就是说对明没有特定的身份。(3)需要缓冲池的场景(4)如果不考虑对象的外部状态,可以用相对较少的共享对象取代很多组合对象,可以使用享元模式来共享对象,然后组合对象来使用这些共享对象。【编程实验】权限管理系统//声明文件//***********************************...原创 2018-04-19 12:27:39 · 1018 阅读 · 0 评论 -
Behavior.Iterator迭代器模式:正向反向遍历集合对象的所有元素
迭代器模式(Iterator Pattern)的定义(1)定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 ①迭代器迭代的是具体的聚合对象(如数组和链表等),它围绕的是“访问”做文章。 ②可用不同的遍历策略来遍历聚合,比如是否需要过滤 ③为不同聚合结构提供统一的迭代接口,也就是说通过一个迭代接口可以访问不同的聚合结构,这叫做多态迭代。标准的迭代模式实现基本...原创 2018-04-20 12:09:06 · 496 阅读 · 0 评论 -
迭代器模式的应用之带过滤和双向遍历功能的工资查看系统
思考迭代器模式(1)迭代器的本质:控制访问聚合对象中的元素。迭代器能实现“无须暴露聚合对象的内部实现,就能够访问到聚合对象的各个元素的功能”,做到“透明”的访问聚合对象中的元素。注意迭代器能够即“透明”访问,又可以“控制访问”聚合对象,认识这点,对于识别和变形使用迭代器模式很有帮助。(2)迭代器的关键思想:把对聚合对象的遍历访问从聚合对象中分离出来,放入单独的迭代器中,这样聚合对象会变得简单,而且...原创 2018-04-20 12:14:18 · 515 阅读 · 0 评论 -
中介者模式的应用之用电脑播放电影
思考中介者模式(1)中介者模式的本质:封装交互。中介者的目的,就是用来封装多个对象的交互,这些交互的处理多在中介者对象里面实现。只要是实现封装对象之间的交互功能,就可用中介者模式,而不必过于拘泥于中介者模式本身的结构。(2)需要Mediator接口吗 这取决于是否会提供多个不同的中介者实现。如果中介者实现只有一个的话,而且预计中也没有扩展的需求,那就可以不定义Mediator接口。如果中介者实现...原创 2018-04-27 12:12:15 · 227 阅读 · 0 评论 -
Behavior.Mediator中介者模式:UpInform + DownNotify网状结构转星状结构
中介者模式(Mediator Pattern)的定义(1)定义:用一个中介对象来封装一系统对象交互。中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 ①中介者模式主要用来将同事类之间网状结构变为星状结构,使同事类之间的关系变的清晰一些。 ②所有对象只跟中介者对象进行通信,相互之间不再有联系,这样也能够集中控制这些对象的交互关系。(2)中介者模...原创 2018-04-27 12:10:37 · 230 阅读 · 0 评论 -
Behavior.State状态模式:不同状态平行不可替换,有规律地相互切换
状态模式(State Pattern)的定义(1)定义:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 ①状态和行为,它们的关系可以描述为“状态决定行为” ②因状态是在运行期被改变,行为也会在运行期根据状态的改变而改变。看起来,同一个对象,在不同的运行时刻,行为是不一样的,就像是类被修改了一样。(2)状态模式的结构和说明 ①Context:环境,也称上下文,通常用...原创 2018-04-20 12:53:24 · 476 阅读 · 0 评论 -
观察者模式的应用之模拟事件监听系统
思考观察者模式(1)观察者模式的本质:触发联动。当修改目标对象的状态时,就会触发相应的通知,然后会循环调用所有观察者对象的相应方法,通知这些观察者,让其做相应的反应。其实就相当于联动调用这些观察者的方法。它将目标对象与观察者解耦,这样目标对象与观察者可以独立变化,但又可以正确联动起来。(2)目标对象和观察者之间的关系 ①一个目标只有一个观察者,也可以被多个观察者观察。 ②一个观察者可以观察多个...原创 2018-04-20 12:41:58 · 334 阅读 · 0 评论 -
Behavior.Observer观察者模式:AttachDetachWhenChangedThenUpdate, AllObserversUpdated
观察者模式(Observer Pattern)的定义(1)定义:定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 (2)观察者模式的结构和说明(拉模型) ①Subject:目标对象,通常具如的功能:一个目标可以被多个观察者观察;目标提供对观察者的注册和退订的维护;当目标的状态发生变化时,目标负责通知所有注册的、有效的观察者。 ②Obse...原创 2018-04-20 12:38:15 · 205 阅读 · 0 评论 -
Behavior.Memento备忘录模式:宽接口内置,中间数据的备份和还原
1. 备忘录模式(Memento Pattern)的定义(1)定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 ①不破坏封装性:对象不能暴露它不应该暴露的细节。 ②捕获对象的内部状态:保存状态的目的是为了恢复,把以将某个对象的状态保存在备忘录对象中,以便以后的恢复。 ③对象的内部状态保存在备忘录对象中,而备忘录对象通...原创 2018-04-20 12:33:33 · 186 阅读 · 0 评论 -
解释器模式的应用之机器人控制程序
解释器模式的优缺点(1)优点 ①易于实现文法:在解释器模式中,一条语法规则用一个解释器对象来解释执行。对于解释器的实现来讲,功能就变得比较简单,只需要考虑这一条语法规则的实现就可以了,其他的都不用管。 ②易于扩展新的语法。由于解释器采用类来描述语法规则,因此可以通过继承等机制创建相应的解释器对象,在创建抽象语法树的时候使用这个新的解释器对象就可以了。(2)缺点 ①执行效率较低。由于在解释器模...原创 2018-04-20 12:28:05 · 526 阅读 · 0 评论 -
解释器模式的应用之中文数字转阿拉伯数字
思考解释器模式(1)解释器模式的本质:分离实现,解释执行。通过一个解释器对象处理一个语法规则的方式,把复杂的功能分离开,然后选择需要被执行的功能,并把这些功能组合成需要解释执行的抽象语法树,再按照抽象语法树来解释执行,实现相应的功能。从本质上看,解释器模式的思路仍然是分离、封装和简化,这与很多其他模式是一样的。(2)谁来构建抽象语法树——解析器 解析器的工作主要就是用来构建抽象语法树的,这个角色...原创 2018-04-20 12:23:40 · 264 阅读 · 0 评论 -
Behavior.Interpreter解释器模式:构建语法树
解释器模式(Interpreter Pattern)的定义(1)定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 ①文法:即语法规则。在解释器模式中每一个语法都将对应一个解释器对象,用来处理相应的语法规则。它对于扩展、改变文法以及增加新的文法规则都很方便。 ②解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如...原创 2018-04-20 12:18:55 · 386 阅读 · 0 评论 -
Structural.Flyweight享元模式:支持大量细粒度对象
思考享元模式 ①享元模式的本质:分离与共享。享元模式的关键在于分离变与不变,把不变部分作为享元对象的内部状态,而变化部分则作为外部状态,由外部来维护.这样享元对象就能够被共享,从而减少对象的数量,并节省大量的内存空间。 ②享元模式的变与不变:为什么在一个地方要预留接口,一个常见的原因是这里存在变化,可能在今后需要扩展或改变己有的实现,而预留接口作为“可插入性的保证” ③享元对象:又有共享(C...原创 2018-04-19 12:21:09 · 238 阅读 · 0 评论 -
Behavior.Visitor访问者模式:算法与数据结构的分离
访问者模式(Visitor Pattern)的定义(1)定义:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 ①模式是要解决当为对象添加新的操作和功能时候,如何尽可能不修改对象的类的一种方法。一般为对象添加功能,是需要向对象添加成员函数,但这里是通过添加一个访问者,由访问者去实现对象需要的新功能。 ②该模式主要是针对为一系列对象添加不...原创 2018-04-23 12:10:45 · 227 阅读 · 0 评论 -
适配器模式的应用之让数据库型的日志管理系统同时支持早期文本文件的管理方式
//声明文件//************************************日志数据对象********************************//日志数据对象class CLogModel{private: string strLogId;//日志编号 string strUser;//操作人员 string strOptTime;//操作日期 string s...原创 2018-04-18 12:24:48 · 250 阅读 · 0 评论 -
Structural.Adapter适配器模式:新接口,老方法
思考适配器模式 ①适配器模式的本质:转换匹配,复用功能。它通过转换调用己有的实现,从而能把己有的实现匹配成需要的接口,使之能满足客户端的需要。 ②适配器模式的动机:将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存的对象所不满足的。为了应对这种“迁移的变化”,既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口而提出的。 ③适配器模式的意图:将一个接口转换成客...原创 2018-04-18 12:18:22 · 156 阅读 · 0 评论 -
Creational.Prototype原型模式:深拷贝、浅拷贝、写时拷贝
思考原型模式 ①原型模型的本质:克隆生成对象 ②原型模式可以用来解决“只知接口而不知实现的问题”,出现一种“接口造接口”的假象。 ③原型模式的重心还是在创建新的对象实例。至于创建出来的对象,其属性的值是否一定要和原型对象完全一样,这并没有强制规定,但一般会拷贝成一样的。 ④通过克隆出来实例是原型实例是两个完全独立的实例,他们之间没有关联。【编程实验】订单拆分处理//创建型模式:原型模式//...原创 2018-04-17 14:39:30 · 188 阅读 · 0 评论 -
项目经理,一个Java程序员和一个C++程序员
//声明文件class CUserInterfaceLayer{//界面层private: string strLayer;public: void SetLayer(string language); string GetLayer();};class CBusinessLogicLayer{//业务逻辑层private: string strLayer;public: v...原创 2018-04-17 14:07:13 · 1157 阅读 · 0 评论 -
建造者模式的应用之Xml和Txt生成器
Builder模式的使用场合(1)相同的方法,不同的执行顺序,产生不同的事件结构时,可以采用建造者模式。(2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。(3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个可以使用该模式。【编程实验】将数据导出为txt和xml格式的文件 ①文件头:包括部门ID、导出数据的日期 ②文件体:表名称、分条...原创 2018-04-16 14:35:46 · 265 阅读 · 0 评论 -
Creational.Builder建造者模式:构造流程和具体实现的分离
建造者模式的思考(1)建造者模式的功能:构建复杂的产品,而且是细化的、分步骤的构建产品。也就是其重在一步一步解决构造复杂对象的问题。 ①构建的过程是统一的、固定不变的(则指导者来制定)。变化的是的每步的具体的实现,由建造者来实现。 ②建造者模式的重心在于分离构建算法和具体构造的实现。(2)建造者模式的构成——两个部分 ①Builder接口:这里定义了如何构建各个部件,也就是知道每个部件的功能...原创 2018-04-16 14:31:59 · 229 阅读 · 0 评论 -
Creational.AbstractFactory抽象工厂模式:产品族易扩展,产品等级不易扩展
//提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类产品族和产品等级①产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构,功能相关联的产品组成的家族。如,AMD的主板、芯片组、CPU组成一个家族,Intel的主板、芯片组、CPU组成一个家族。 ②产品等级结构:产品等级结构即产品的继承结构。如抽象电视机与具体品牌的电视机之间构成了一个产品等级结构。如,A...原创 2018-04-16 14:27:15 · 477 阅读 · 1 评论 -
简单工厂模式的应用之简单实现ODBC/JDBC驱动管理器的雏形
class CDbConn{public: CDbConn(const char* lpszConn); bool Open(); bool Close();};class CDbRs{};//抽象产品类class CAbsDb{protected: CDbConn* pConn;public: CAbsDb(const char* lps...原创 2018-04-16 14:08:56 · 225 阅读 · 0 评论 -
Creational.SimpleFactory简单工厂模式:提供操作符返回运算对象
//提供一个创建对象实例的功能,而无须关心其具体实现。//声明文件//运算类(其它的加减乘法类从这里继承)class CAbsOpt{protected: double dNumber1; double dNumber2;public: void SetNumber1(double number); double GetNumber1(); void ...原创 2018-04-16 13:58:40 · 135 阅读 · 0 评论 -
Structural.Bridge桥接模式:分离实体所具有的行为
思考Bridge模式 ①Bridge模式的本质:分离抽象和实现。它是解决多继承的一套方案,把使用继承改成使用对象组合,解耦了抽象和实现之间固有的绑定关系,从而使“抽象”和“实现”可以沿着各自的纬度独立的变化。 ②Bridge模式的动机:Bridge模式就是为了处理类的多维度变化,其目的是解耦。 ③由于抽象部分和实现部分是完全分离的。所以可以在运行时动态组合具体的真实实现,从而动态变换功能。此...原创 2018-04-18 12:31:07 · 214 阅读 · 0 评论 -
桥接模式的应用之三层架构中的业务逻辑层(BLL)与数据访问层(DAL)的解耦
各层的作用 ①用户界面层:只负责显示和采集用户操作。 ②业务逻辑层:负责UI和DAL层之间的数据交换,是系统架构中体现核心价值的部分。它关注点主要集中在业务规则的制定、业务流程的实现和业务需求的有关系统设计。它与系统所对应的领域(Domain)有关。也可以做一些如用户权限合法性和数据据式是否正确等验证检查。 ③数据访问层:与数据库直接打交道,如数据库进行增、删、改、查等操作。常用的技术如AD...原创 2018-04-18 12:37:24 · 2395 阅读 · 0 评论 -
Behavior.Strategy策略模式:策略平等可替换,容错恢复机制
策略模式(Strategy Pattern)的定义(1)定义:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 ①算法是同一接口的不同实现,地位是平等的,可以相互替换。 ②引入上下文对象,可以实现让算法能独立使用它的客户。因为这个对象负责持有算法,但不负责决定具体选用哪个算法,把选择算法的功能交给了客户。 ③当客户通知上下文对象执行功能...原创 2018-04-23 12:06:35 · 345 阅读 · 0 评论 -
模板模式的应用之两种登录控制(普通用户和管理员)
思考模板方法模式(1)模板方法模式的本质:固定算法骨架(2)模板方法模式的核心:处理某个流程的代码己经都具备,但是其中某些节点的代码不能确定。因此,将这些节点的代码实现转移给子类完成。即处理步骤父类中己经定义好,具体实现延迟到子类中定义。(3)模板方法中的变与不变 ①需要变化的地方都通过纯虚函数,把具体实现延迟到子类中。 ②不变的部分,进行公共实现。(4)好莱坞法则:Don’t call me...原创 2018-04-23 11:59:19 · 15186 阅读 · 0 评论 -
Behavior.TemplateMethod模板方法模式:共同方法提升至父类
模板方法模式(Template Method Pattern)的定义(1)定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。(2)模板方法模式的结构和说明 ①AbstractClass:抽象类。用于定义算法骨架和抽象的原语操作,具体的子类通过重定义这些原语操作来实现一个算法的各个步骤。在这个类里面,还可以提供算...原创 2018-04-23 11:18:13 · 151 阅读 · 0 评论 -
外观模式的应用之模拟编译器
外观模式的使用场景(1)为一个复杂的模块或子系统提供一个外界访问的接口(2)子系统相对独立,外界对子系统访问只要黑箱操作即可。如利息计算很复杂,需要深厚的业务知识和扎实的技术水平。但对于客户端来讲,要求输入金额和存期,就可以返回最终的利息。这里可以用外观模式。(3)当需要构建一个层次结构的子系统时,使用Façade定义子系统中每层的入口点。如果子系统是相互依赖的,可以让它们仅通过Façade进行通...原创 2018-04-18 13:42:54 · 204 阅读 · 0 评论 -
Structural.Facade外观模式:实现一键式操作
外观模式的结构和说明①Façade:定义子系统的多个模块对外的高层接口,通常需要调用内部多个模块,从而把客户的请求代理给适当的子系统对象 ②模块:接受Façade对象的委派,真正实现功能,各个模块之间可能有交互。但请注意,Façade对象知道各个模块,但是各个模块不应该知道Façade对象。思考外观模式 ①外观模式的本质:封装交互、简化调用。Façade封装了子系统外部和子系统内部多个模块的交...原创 2018-04-18 13:39:13 · 197 阅读 · 0 评论 -
装饰模式的应用之在显示每个Window前追加显示某个logo的功能
//声明文件//************************************************************************************//结构型模式:装饰模式//场景:在显示每个Window前追加显示某个logo的功能。//************************抽象组件类******************class CBaseW...原创 2018-04-18 13:00:00 · 158 阅读 · 0 评论 -
Structural.Decorator装饰模式:动态扩展对象功能
装饰模式的结构和说明①Component:组件对象的接口,可以给这些对象动态地添加职责。 ②ConcreteComponent:具体的组件对象,实现组件对象接口,通常就是被装饰器装饰的原始对象,也就是可以给这个对象添加职责。 ③Decorator:所有装饰器的抽象父类,需要定义一个与组件接口一致的接口,并持有一个Component对象的指针,其实就是持有一个被装饰的对象。之所以从Decorat...原创 2018-04-18 12:56:31 · 203 阅读 · 0 评论 -
组合模式的应用之绘制基本图形和复合图形对象
组合模式的使用场景(1)通常,组合模式会组合出树型结构来,这意味着所有可以使用对象树来描述或操作的功能,都可以考虑使用组合模式,如UI界面设计中的容器对象、读取XML或对语句进行语法分析、OA系统中组织结构的处理、操作系统的资源管理器等。(2)如果想表示对象的部分——整体层次结构,把整体和部分的操作统一起来,使得层次结构实现更简单,从外部来使用这个层次结构也容易。(3)如果希望统一地使用组合结构中...原创 2018-04-18 12:49:50 · 1035 阅读 · 0 评论