设计模式
happyrabbit456
这个作者很懒,什么都没留下…
展开
-
原型模式——设计模式系列
运用场合 当一个类的组成比较复杂,例如包含多个组件或多个自定义类属性的时候,直接复制当前对象比从头开始创建对象要简单得多,则使用原型模式最为合适。又或者对象间的区别不大,只是几个属性不同的时候,也可以使用原型模式,前提是要继承同一个父类。 浅复制与深复制 浅复制——只复制对象的指针。深复制——复制对象的内容,用新的指针指向新的内容。转载 2013-06-21 10:16:26 · 512 阅读 · 0 评论 -
设计模式 - 外观模式
外观模式还是相当普遍的,先来看看几个例子:1. 一台电脑有很多东西组成,包括硬件,软件。硬件又包含主板,CPU,内存什么的,软件又包含操作系统,操作系统里面又有一大堆非常复杂的驱动,各个驱动之间又有很多关系。那么我们怎么启动这么复杂的一个东西呢?我们所要做的就是按一下电源开关。当用户按下电源开关后,操作系统会把电脑运行起来,中间过程那是相当的复杂。对于用户来说,电源开关就是一个简单使用的接转载 2013-06-24 14:51:40 · 618 阅读 · 0 评论 -
设计模式 - 桥接模式
桥接模式是结构型模式里面相对复杂的一种模式,但是同时也是很有用的。我们先来考虑这么一种情况(这个例子是设计模式书上的一个例子),Window是一个类,这个类用来画一个窗口。那么我们现在如果要支持XP风格和WIN7风格,应该怎么做呢?通常首先能想到的就是子类化Window,比如增加2个类:WindowsXP和Windows7。然后这2个子类可以各自实现各自的风格,这个没有问题。而且这也是转载 2013-06-24 14:23:36 · 598 阅读 · 0 评论 -
23种设计模式(7):中介者模式
定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。类型:行为类模式类图:中介者模式的结构 中介者模式又称为调停者模式,从类图中看,共分为3部分: 抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子转载 2013-06-24 15:36:40 · 512 阅读 · 0 评论 -
23种设计模式(8):观察者模式
定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。类型:行为类模式类图: 在软件系统中经常会有这样的需求:如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化。比如,我们要设计一个右键菜单的功能,只要在软件的有效区域内点击鼠标右键,就会弹出一个菜单;再比如,我们要设计一个自动部署转载 2013-06-24 17:26:15 · 543 阅读 · 0 评论 -
设计模式C++学习笔记之十五(Composite组合模式)
15.1.解释概念:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合的使用具有一致性。main(),客户CCorpNode,抽象基类,实现基本信息CBranchNode,树枝节点,实现Addordinate()函数和GetSubordinate()函数CLeafNode,叶子节点,IsLeaf属性总是“true”说明:组合模式主转载 2013-06-25 10:11:24 · 563 阅读 · 0 评论 -
Objective-C 设计模式-组合模式 (Composite)
组合模式定义 把具有相同基类类型的对象组合到树形结构中,以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。组合模式使得树形结构中的每个节点都具有相同的抽象接口,整个结构可作为一个统一的抽象结构使用,而不暴露其内部表示。每个节点的任何操作,可以通过抽象基类中定义的相同接口来进行。 何时使用组合模式想把对象抽象成树形结构,具有“部分转载 2013-06-25 10:17:24 · 924 阅读 · 0 评论 -
在组合模式中实现访问者(VISITOR)模式
本文从一个给定的实现了组合(Composite)模式的例子开始,说明怎么在这个数据结构上实现业务逻辑代码。依次介绍了非面向对象的方式、在组合结构中加入方法、使用访问者(Visitor)模式以及用改进后的访问者(Visitor)模式来实现相同的业务逻辑代码,并且对于每种实现分别给出了优缺点。 读者定位于具有Java程序开发和设计模式经验的开发人员。 读者通过本文可以学到如何在组合转载 2013-06-25 14:30:00 · 771 阅读 · 0 评论 -
设计模式C++学习笔记之十四(Iterator迭代器模式)
14.1.解释概念:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。main(),客户IProject,产品接口CProject,产品类IIterator,迭代器接口IProjectIterator,产品迭代器接口CProjectIterator,产品迭代器实现类说明:CProject实现产品类,能够返回一个转载 2013-06-25 10:53:13 · 590 阅读 · 0 评论 -
23种设计模式(9):访问者模式
定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。类型:行为类模式类图: 访问者模式可能是行为类模式中最复杂的一种模式了,但是这不能成为我们不去掌握它的理由。我们首先来看一个简单的例子,代码如下:[java] view plaincopyclass转载 2013-06-25 11:26:42 · 543 阅读 · 0 评论 -
23种设计模式(11):责任连模式
定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。类型:行为类模式 首先来看一段代码:[java] view plaincopypublic void test(int i, Request request){ if(i==1){转载 2013-06-25 16:43:47 · 515 阅读 · 0 评论 -
设计模式 - 装饰模式
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 结构图结构图好像和Composite模式有点像。确实是,我们后面再讲Decorator和Composite模式的关系。从结构图中我们可以看出Decorator的子类可以对Component进行一些扩充。这也就是Decorator模式的作用:对一个现有的类进行扩充转载 2013-06-25 14:57:51 · 553 阅读 · 0 评论 -
设计模式 - 策略模式
Strategy Pattern,个人用的最多的一种模式之一。这种模式比较简单,但是却很有效。意图定义一系列的算法,把它们一个一个封装起来,并且使它们可以互相替换。本模式使得算法可独立于使用它的客户而变化。结构从结构上看策略模式还是蛮简单的,两个参与者:context和strategy。context会将它的客户的请求转发给context的策略对象。从而相应转载 2013-06-26 14:03:59 · 600 阅读 · 0 评论 -
模板方法模式(TemplateMethod)
模板方法模式(TemplateMethod),定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板方法模式是通过把不变行为搬移到父类,去除子类中的重复代码来体现它的优势。 模板方法模式就是提供了一个很好的代码复用平台。因为有时候,我们会转载 2013-06-26 08:41:19 · 559 阅读 · 0 评论 -
23种设计模式(10):命令模式
定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。类型:行为类模式类图:命令模式的结构 顾名思义,命令模式就是对命令的封装,首先来看一下命令模式类图中的基本结构:Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute转载 2013-06-28 13:33:33 · 612 阅读 · 0 评论 -
设计模式C++实现(9)——享元模式
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》(DP)两本书。本文介绍享元模式的实现。 举个转载 2013-06-28 15:09:32 · 586 阅读 · 0 评论 -
设计模式C++实现(8)——代理模式
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》(DP)两本书。本文介绍代理模式的实现。 [D转载 2013-06-28 15:24:57 · 567 阅读 · 0 评论 -
设计模式C++描述----17.备忘录(Memento)模式
一. 备忘录模式定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。结构图: 使用范围:Memento 模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator 可以根据保存的 Memento 信息还原到前一状态。转载 2013-06-28 16:38:27 · 600 阅读 · 0 评论 -
适配器模式 - 设计模式系列
适配器模式,用于连接两种不同种类的对象,使其协同工作。一边是客户端懂得如何使用的目标接口,另一边是客户端一无所知的被适配者。适配器的主要作用是把被适配者的行为传递给管道另一端的客户端。核心代码:[html] view plaincopy// // StrokeColorCommand.h // TouchPai原创 2013-06-24 13:54:52 · 656 阅读 · 0 评论 -
设计模式六大原则(6):开闭原则
定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。问题由来:在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。 开闭原则是面转载 2013-06-21 14:53:02 · 479 阅读 · 0 评论 -
23种设计模式(5):原型模式
定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。类型:创建类模式类图:原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clo转载 2013-06-21 10:18:38 · 521 阅读 · 0 评论 -
工厂方法——设计模式系列
工厂方法大家都很熟悉了,简单概括就是专门创建几个类来创建业务逻辑对象,它专注于让子类决定创建什么对象。 工厂方法在以下情形下会用到:编译器无法准确预期要创建对象的类;类想让其子类决定在运行时创建什么。要实现这一目标,就需要有一个产品父类和生成器父类。 核心代码如下:- (void) loadCanvasViewWithGenera转载 2013-06-21 10:28:34 · 567 阅读 · 0 评论 -
抽象工厂方法——设计模式系列
抽象工厂方法与工厂方法很相似,目的都是创建对象而不让客户端知晓返回了什么确切的对象。不同点是抽象工厂往往是要返回多系列的产品,而工厂方法是返回一种产品。抽象工厂是在工厂方法的基础上再创建一个父类,里面会有一个返回自身对象的factory方法,用以根据客户端传入的参数而返回具体的产品。这个父类还会定义产品中包含的各种组件。具体代码如下:@implementation Branding转载 2013-06-21 10:52:41 · 560 阅读 · 0 评论 -
23种设计模式(3):抽象工厂模式
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。类型:创建类模式类图:抽象工厂模式与工厂方法模式的区别 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,转载 2013-06-21 11:02:27 · 510 阅读 · 0 评论 -
生成器模式——设计模式系列
生成器模式有两个核心概念,一个是Director(指导者)、一个是Builder(生成器)。Builder知道如何在缺少某些特定信息的情况下建造产品,Director知道Builder应该建造什么,以参数向其提供缺少的信息来建造特定产品。生成器关注分步创建复杂对象,在最后一步返回产品。以下以代码进行说明。//最终产品@interface Character : NSObje转载 2013-06-21 11:46:15 · 546 阅读 · 0 评论 -
23种设计模式(4):建造者模式
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。类型:创建类模式类图:四个要素产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。抽象建造者:引入抽象转载 2013-06-21 11:55:38 · 500 阅读 · 0 评论 -
IOS设计模式之一:单例模式
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。#import @interface Singleton : NSObject +(Singleton *) instance;@end @implementation Singleton+(Singleton *) instance {转载 2013-06-21 13:09:03 · 520 阅读 · 0 评论 -
IOS设计模式之二:Delegate模式
代理模式 顾名思义就是委托别人去做事情。IOS中经常会遇到的两种情况:在cocoa框架中的Delegate模式与自定义的委托模式。下面分别举例说明一下:一、cocoa框架中的delegate模式在cocoa框架中的Delegate模式中,委托人往往是框架中的对象(视图中的控件、表视图神马的),代理人往往是视图控制器对象。在我们这个例子中UITableView是委托人转载 2013-06-21 13:12:46 · 503 阅读 · 0 评论 -
IOS设计模式之三:MVC模式
提到ios中的mvc不得不提2011秋季斯坦福课程的老头,他的iphone开发公开课是所有描述ios中mvc模式最为准确并且最为浅显易懂的。模型-视图-控制器这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团队里吵了架的同事,如果有项目需要他俩来参与,那么最好有第三者来管理他俩之间的沟通与转载 2013-06-21 13:14:37 · 605 阅读 · 0 评论 -
IOS设计模式之四:观察者模式
cocoa框架中很多地方都使用了观察者模式一、KVOKey-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。每次指定的被观察的对象的属性被修改后,KVO自动通知相应的观察者。model中的定义:@interface StockData : NSObject { NSString * stockName;转载 2013-06-21 13:17:35 · 574 阅读 · 0 评论 -
设计模式六大原则(1):单一职责原则
定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。解决方案:遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T转载 2013-06-21 14:05:21 · 499 阅读 · 0 评论 -
设计模式六大原则(2):里氏替换原则
肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑。其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的。定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子转载 2013-06-21 14:12:15 · 480 阅读 · 0 评论 -
设计模式六大原则(3):依赖倒置原则
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接转载 2013-06-21 14:19:42 · 500 阅读 · 0 评论 -
设计模式六大原则(5):迪米特法则
定义:一个对象应该对其他对象保持最少的了解。问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。解决方案:尽量降低类与类之间的耦合。 自从我们接触编程开始,就知道了软件编程的总的原则:低耦合,高内聚。无论是面向过程编程还是面向对象编程,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。低耦合的优点不言而喻,但是怎么转载 2013-06-21 14:46:50 · 486 阅读 · 0 评论 -
Java模式(适配器模式)
今天看了下Java中的适配器模式,以下就来小做下总结和谈谈感想,以便日后使用。 首先,先来先讲讲适配器。适配就是由“源”到“目标”的适配,而当中链接两者的关系就是适配器。它负责把“源”过度到“目标”。举个简单的例子,比如有一个“源”是一个对象人,他拥有2种技能分别是说日语和说英语,而某个岗位(目标)需要你同时回说日语、英语、和法语,好了,现在我们的任务就是要将人这个“源”适配的这个转载 2013-06-21 16:05:11 · 519 阅读 · 0 评论 -
设计模式六大原则(4):接口隔离原则
定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。举例来说明接口隔离原则:转载 2013-06-21 14:30:56 · 537 阅读 · 0 评论 -
How to properly implement ARC compatible and `alloc init` safe Singleton class?
Apple recommends the strict singleton implementation (no other living object of the same type is allowed) this way:+ (instancetype)singleton { static id singletonInstance = nil; if (!singlet转载 2013-12-10 12:43:41 · 766 阅读 · 0 评论