设计模式
文章平均质量分 65
freshow
这个作者很懒,什么都没留下…
展开
-
【C++】Chapter17:单例模式
首先温馨的提示一个简单的概念:所有类都有构造方法,不编码则系统默认生成空的构造方法,若有显示定义的构造方法,默认的构造方法就会失败。单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。单例模式封装它的唯一实例,这样它可以严格地控制客户怎样访问它以及何时访问它。简单地说就是对唯一实例的受控访问。单实例模原创 2010-06-27 16:24:00 · 1612 阅读 · 0 评论 -
【C++】Chapter22:享元模式
<br />享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目。<br />在现实中什么时候才会应该考虑使用享元模式呢?如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该原创 2010-07-23 23:10:00 · 800 阅读 · 0 评论 -
【C++】Chapter23:解释器模式
解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。解释器模式(interpreter)结构图原创 2010-07-28 20:56:00 · 1798 阅读 · 3 评论 -
【C++】Chapter24:访问者模式
<br />访问者模式(visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。访问者模式的目的是要把处理从数据结构分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。反之,如果这样的系统的数据结原创 2010-08-01 21:01:00 · 1241 阅读 · 1 评论 -
【C++】Chapter25:模式总结(上)
创建型模式为什么我们需要创建型模式?因为创建型模式隐藏了这些类的实例是如何被创建和放在一起,整个系统关于这些对象所知道的是由抽象类所定义的接口。这样,创建型模式在创建了什么、谁创建它、它是怎么被创建的,以及何时创建这些方面提供了很大的灵活性。创建型模式抽象了实例化的过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。创建型模式都会将关于该系统使用哪些具体的类的信息封装起来。允许客户用结构和功能差别很大的“产品”对象配置一个系统。配置可以是静态的,即在编译时指定,也可以是动态的,就是运行时再指定。当原创 2010-08-03 22:22:00 · 864 阅读 · 0 评论 -
【C++】Chapter11:抽象工厂模式
先说下之前用到过的【工厂方法模式】是定义一个用于创建对象的接口。让子类决定实例化哪一个类。在说【抽象工厂模式(Abstract Factory)】,提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式的优点和缺点:最大的好处便是易于交换产品系列,由于具体工厂类,例如 IFactory factory = new ConcreteFactory(), 在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。原创 2010-06-07 21:05:00 · 1198 阅读 · 0 评论 -
【C++】Chapter25:模式总结(下)
行为型模式观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。对象间,尤其是具体对象间,相互知道的越少越好,这样发生改变时才不至于相互影响。对于观察者模式,目标和观察者不是紧密耦合的,他们可以属于一个系统中的不同抽象层次,目标所知道的仅仅是它有一系列的观察者,每个观察者实现Observer的简单接口,观察者属于哪一个具体类,目标是不知道的。观察者(Observer)模版模式:定义一个操作的算法骨架,而将一些步骤延迟到子类中,模版方法使得子类可以原创 2010-08-08 00:09:00 · 875 阅读 · 2 评论 -
【C++】Chapter25:模式总结(中)
结构型模式适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原来由于接口不兼容而不能一起工作的那些类可以一起工作。现实中往往会有下面这些情况,想使用一个已经存在的类,而它的接口不符合要求,或者希望创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作。适配器模式可以让这些接口不同的类通过适配后,协同工作。适配器(Adapter)桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。继承是好东西,但往往会过度地使用,继承会导致类的结构过于复杂,关系太多,难以维护,而原创 2010-08-06 00:37:00 · 748 阅读 · 0 评论 -
【C++】Chapter14:备忘录模式
备忘录(Memento)模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。把保存的细节给封装在了Memento中了,任何时候要更改保存的细节也不用影响客户端了。Memento模式比较适合用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来原创 2010-06-16 21:58:00 · 1071 阅读 · 1 评论 -
【C++】Chapter16:迭代器模式
迭代器模式(Iterator)提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式。同时需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一接口。迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。原创 2010-06-19 11:15:00 · 1553 阅读 · 4 评论 -
【C++】Chapter13:适配器模式
适配器模式(Adapter): 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。简单地说,就是需要的东西就在面前,但却不能使用,而短时间又无法改造它,于是就想办法适配它。适配这个词可以这样理解。比如,有些国家用110V电压,而我们国家用的是220V,但我们的电器,比如笔记本电脑是不能什么电压都能用的,但国家不同,电压可能不相同也是事实,于是就用一个电源适配器,只要是电,不管多少伏,都能把电源变成需要的电压,这就是电源适配器的原创 2010-06-15 18:01:00 · 1053 阅读 · 1 评论 -
【C++】Chapter12:状态模式
先唠叨一句:面向对象设计其实就是希望做到代码的责任分解。状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。状态模式的好处与用处:状态模式的好处是:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个具体(ConcreteState)的状态类中,所以原创 2010-06-14 21:11:00 · 1205 阅读 · 6 评论 -
【C++】Chapter10:观察者模式
观察者模式,又叫做发布-订阅(Publish/Subscribe)模式观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使得它们能够自动更新自己。 观察者模式的动机将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维护一致性而使各类紧密耦合,这样会给原创 2010-05-24 00:43:00 · 1219 阅读 · 5 评论 -
【C++】Chapter21:中介者模式
<br />中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式尽管减少了ConcreteColleague类之间的耦合,但这又使得ConcreteMediator责任太多了,如果它出了问题,则整个系统都会有问题。<br />中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反复思考你的系统在设计上是不是合理。<br /原创 2010-07-17 16:37:00 · 1424 阅读 · 3 评论 -
【C++】Chapter20:职责链模式
<br />职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。<br />职责链的好处是当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它。这就使得接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,他们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接收原创 2010-07-17 13:30:00 · 883 阅读 · 0 评论 -
【C++】Chapter1:简单工厂模式
题目:实现计算器的输入2个数和运算符,得到结果 工程结构:(1)头文件COperationFactory.h(运算符工厂类) (2)源文件SimpleFactory.cpp(客户端应用类,主函数所在) (3)运算类COperation.cpp(运算符基类)COperation.hCOperationAdd.h(加法运算符子类,继承于COperation)CO原创 2010-04-28 23:45:00 · 1448 阅读 · 13 评论 -
【C++】Chapter2:策略模式
题目:商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。比如:商场的打一折和打九折只是形式的不同,抽象分析出来,所有的打折算法都是一样的,所以打折算法应该是一个类。 工程结构:(1)抽象算法类CStrategy.h(2)具体算法类CC原创 2010-05-01 00:23:00 · 1172 阅读 · 0 评论 -
【C++】Chapter3:装饰模式
单一职责原则:单一职责原则,就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责,就应原创 2010-05-01 20:35:00 · 950 阅读 · 0 评论 -
【C++】Chapter4:代理模式
代理模式应用场景:男生A代替男生B给漂亮女生C,送鲜花、巧克力、情书… 对于漂亮女生C只知道男生A的存在,并不知道B的存在。 但实际上B确实是存在的。 代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问。 代理模式的应用场景第一:远程代理,也原创 2010-05-06 23:24:00 · 1331 阅读 · 4 评论 -
【C++】Chapter5:工厂方法模式
先说下简单工厂和工厂方法的区别:简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现产品类,选原创 2010-05-08 01:04:00 · 843 阅读 · 1 评论 -
【C++】Chapter18:桥接模式
先来个设计原则上的建议:因为对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系。以致于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。合成/聚合复用原则,尽量使用合成/聚合,尽量不要使用类继承。合成(Composition,也有翻译成组合)和聚合(Aggregation)都是关联的特殊种类。聚合表示一种弱的“拥原创 2010-07-05 19:32:00 · 1071 阅读 · 0 评论 -
【C++】Chapter19:命令模式
<br />命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。<br />命令模式的优点:<br />第一,它能较容易地设计一个命令队列;<br />第二,在需要的情况下,可以较容易地将命令记入日志;<br />第三,允许接收请求的一方决定是否要否决请求;<br />第四,可以容易地实现对请求的撤销和重做;<br />第五,由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。<br />最关键的优点是原创 2010-07-05 22:01:00 · 1005 阅读 · 2 评论 -
【C++】Chapter6:原型模式
原型模式(Prototype),用原型实例指针创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。不用重新初始化对象,而是动态地获得对象运行时的状态。 在很多关于原型模式的JAVA、C#的资料中都原创 2010-05-20 22:41:00 · 820 阅读 · 0 评论 -
【C++】Chapter8:外观模式
迪米特法则:也叫最少知识原则。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。 迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限,也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开。迪米特法则其根本思想是强调了类之间的松耦合。原创 2010-05-21 23:46:00 · 758 阅读 · 0 评论 -
【C++】Chapter9:建造者模式
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。“建造者(Builder)模式”又叫生成器模式。当我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。它主要是用于创建一些复杂的对象,这些对象原创 2010-05-22 13:37:00 · 772 阅读 · 0 评论 -
【C++】Chapter7:模板方法模式
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类去,而不是让每个子类都去重复。 当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模原创 2010-05-21 22:43:00 · 730 阅读 · 0 评论 -
【C++】Chapter15:组合模式
组合模式(Composite)将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。原创 2010-06-18 21:43:00 · 1391 阅读 · 0 评论