设计模式浅析
设计模式浅析
1简单工厂模式: 工厂类通过传入参数获得相应类的实例。
2策略模式: 不同策略创建不同类,当不同类共同继承一个类然后重写共同的方法,不同类的构造函数可能是传入的不同的策略参数。
3代理模式: 代理类和被代理类共同继承同一个接口,而同一个接口是需要代理的方法的定义,代理类的成员包括被代理类,代理类的方法是被代理类对应方法的实现。
4装饰模式: 不同类继承同一个类,重写公共的2个方法,一个是方法是方法(效果),另外一个是把同类装饰到自己类的一个成员的装饰方法,
而方法(效果)中是先实现自己的东西,然后在去执行父类的同一个方法(效果)。
5工厂方法模式: 多个工厂类实现工厂接口(包括一个创建类实例的方法),然后类的实例是有工厂的一个方法(接口中)创建。
6原型模式: 类实现ICloneable接口;其中Clone方法就是创建该类相同参数的一个实例。
7模板方法模式: 有一个共同的类,类中包括一些虚拟的方法,然后几个模板类重写这些虚拟的方法。
8外观模式: 一个公共的类,类中的成员是其他需要处理东西的类,类中的方法是调用其他几个类的方法,类的构造函数是其他几个类的实例化。
9建造者模式: 两个或更多类共同继承同一个虚拟类,虚拟类的一些虚拟方法是创建一个实例的一部分的方法的组合; 然后有一个建造类:建造类的成员是虚拟类,
建造类的方法是虚拟类方法的组合执行;建造类的构造函数是根据不同传入参数创建不同虚拟类的子类的实例。
10观察者模式: 有一个通知接口,有一个事件处理程序的委托,然后不同类的成员包括这个事件成员(事件处理程序的委托)类型,
委托的方法是观察的方法。有点类似于两个窗体之间用委托传递参数一样。
11抽象工厂模式:有一个工厂,工厂中不同的方法创建不同的类,被创建的这些不同类都共同实现相同的接口。
12状态模式: 有一个抽象状态类(包括一个状态传递的方法,方法参数是物体的状态实例),然后不同的状态段继承这个抽象状态类,
抽象状态类中实现该方法是根据条件判断是否是本状态,如果是,则处理然后流程结束,
如果不是则实例化下一个状态类,然后调用下一个状态实例的该方法,传递到下一个状态。
13适配器模式: 有一个公共的接口或许虚拟类,然后有一个中间类来实现当某一个类的方法不适合该接口的时候,由这个中间类实例化的相应类处理。
中间类的成员是这个“不适合”类,中间类的方法名是接口的方法名,方法中的代码是这个不适合类的方法的调用。
14备忘录模式: 有一个状态管理类,他的成员是某个需要保存状态的类,当某个需要保存状态的类需要保存状态时是创建和当前相同的实例赋给这个状态类;
当某个需要保存状态的类需要恢复状态的时候是根据这个状态类的成员信息传入方法改变相应的值。
当状态需要保存几个的时候状态管理需要一个范型或许一种算法提供上一次的状态信息。
15组合模式: 首先需要一个类提供给总类和分类一些公共的属性和方法,然后总类的成员是个范型,范型中的参数(<>,尖括号中的参数)是这个虚拟提供类(分类共有的),
然后总类中有一个方法是对这些分类全部处理或许添加和删除分类。
16迭代器模式: 其实就是foreach的变态吧,就是要有一个接口,接口中的方法要有反映当前成员,下一个成员,第一个成员,接口中还有一个范型用于存放遍历的成员。
17单例模式: 就是在创建实例的时候需要判断该实例是否存在,如果存在则用原来的;在多线程的时候需要加锁机制实现。
18桥接模式: 有一个抽象类,他的成员是自己;具体的类是继承该抽象类,然后重写该抽象类;
抽象类的方法参数的类型是自己类,方法实现是方法参数实例对应的方法。
桥接的意思是当给某个类型(抽象)通过该类的方法传入参数后,该类就表现为传入的东西。
19命令模式: 有个服务类,类中的成员要有一个范型(<>,尖括号中的参数是命令类型),类的方法中有添加命令和删除命令以及全部把范型中的命令执行完毕的方法;
命令抽象类的成员要有命令方法对象(具体做什么),和命令执行方法(服务类调用),构造函数最好是传入命令方法对象;然后有很多命令类继承该命令抽象类;
20职责链模式: 有一个抽象类管理者,该类包括一个自己类型的成员、一个自己类型作为参数的方法以及一个处理方法
(处理方法中判断传入的请求是否能够处理,如果能则处理,否则就调用上级(该类的成员)的该方法处理);然后有一些不同级别的管理者类继承该抽象类管理者。
在实例化各个具体管理者的时候,需要设置对应的上级。
21中介者模式:首先定义一个中介抽象类和参与抽象类,中介抽象类的方法中要有一个构造函数(参数中包括参与抽象类的一个虚方法(执行对方的方法)),
然后有一个中介具体类,中介具体类的成员是两个具体的参与者,中介具体类中的执行方法根据传入参数(具体参与者)判断参与者类型,然后执行参与者对方对应的方法;
两个或更多的参与者(一般两个)继承参与者抽象类,然后添加一些方法。
22享元模式: 有一个需要共享东西的抽象类,有一个创建具体共享东西类实例的工厂类,
该工厂类的成员是抽象共享类的范型类型或者Hashtable,该工厂类还包括一个根据传入参数创建共享东西类的方法,及一些统计方法。
23解释器模式:有一个表达式抽象类,该表达式抽象类中必须有一个根据传入参数的内容进行解释的方法(解释器)和一个根据传入参数执行的方法;
然后一些具体的表达式类继承该表达式抽象类并重写执行方法;在执行表达式的时候一般要用到一个循环(一个一个的解释)。
24访问者模式: 第一步有一个状态抽象类,该状态抽象类有两个后更多的具体方法,这些方法是根据两个或更多的访问者类型对应的。
然后一些具体的状态类继承该状态抽象类并重写两个或更多的抽象类方法(个数和抽象类的具体方法对应);
第二步有一个访问者抽象类,该抽象类中必须有一个执行方法,然后有一些访问者类继承该访问者抽象类重写对应的执行方法。
第三步有一个对象结构类,该类的成员是访问者类的范型,该类包括一个添加访问者方法、移除访问者方法、执行所有的所有访问者的共同方法。
============================================================================================================================================================
一个23设计模式的搞笑解释 (转载:http://www.pkwall.com/result/ab94542)
创建型模式
1、FACTORY ?追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就
是生产鸡翅的Factory
工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客
户端提供。
2、BUILDER???MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就
能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。(这一定比美军在伊拉克用的翻译机好卖)
建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。
建造模式可以强制实行一种分步骤进行的建造过程。
3、FACTORY METHOD ?请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡
呢,让MM直接跟服务员说就行了。
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种
细节。
4、PROTOTYPE ?跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)
原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何
事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。
5、SINGLETON ?俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)
单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。
结构型模式
6、ADAPTER ?在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知
道他会不会耍我)
适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。
7、BRIDGE ?早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么
说”这种问题,自己用BRIDGE组合一下不就行了
桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两
者可以独立的变化。
8、COMPOSITE ?Mary今天过生日。“我过生日,你要送我一件礼物。”“嗯,好吧,去商店,你自己挑。”“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。”“喂,买了三件了呀,我只
答应送一件礼物的哦。”“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。”“……”,MM都会用Composite模式了,你会了没有?
合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一
个个单独的成分对象和由他们复合而成的合成对象同等看待。
9、DECORATOR ?Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买
了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?
装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排
列组合而产生的非常大量的功能。
10、FA?ADE ?我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式,把相机调整到自动档,只要对准
目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。
门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是
说它是一个单例模式。但整个系统可以有多个门面类。
11、FLYWEIGHT ?每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。共
享的句子就是Flyweight,MM的名字就是提取出来的外部特征,根据上下文情况使用。
享元模式:FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的
改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出
去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。
12、PROXY ?跟MM在网上聊天,一开头总是“hi,你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?”这些话,真烦人,写个程序做为我的Proxy吧,凡是接收到这些话都设置好了自动的回答,
接收到其他的话时再通知我回答,怎么样,酷吧。
代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用
一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候
代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。
行为模式
13、CHAIN OF RESPONSIBLEITY ?晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一
个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处女呀,快跑!
责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这
个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。
14、COMMAND ?俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。这不,她弟弟又传送过来一个COMMAND,为了感谢
他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,才请我吃面。”,
命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一
方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。
15、INTERPRETER ?俺有一个《泡MM真经》,上面有各种泡MM的攻略,比如说去吃西餐的步骤、去看电影的方法等等,跟MM约会时,只要做一个Interpreter,照着上面的脚本执行就可以了。
解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法
后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一
个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。
16、ITERATOR ?我爱上了Mary,不顾一切的向她求婚。
?? Mary:“想要我跟你结婚,得答应我的条件”
?? 我:“什么条件我都答应,你说吧”
?? Mary:“我看上了那个一克拉的钻石”
?? 我:“我买,我买,还有吗?”
?? Mary:“我看上了湖边的那栋别墅”
?? 我:“我买,我买,还有吗?”
?? Mary:“你的小弟弟必须要有50cm长”
?? 我脑袋嗡的一声,坐在椅子上,一咬牙:“我剪,我剪,还有吗?”
?? ……
迭代子模式:迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装
到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立
于聚集角色变化。
17、MEDIATOR ?四个MM打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这里拿,赔了钱的也付给我,一切就OK啦,俺得到了四个MM的电话。
调停者模式:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用
。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。
18、MEMENTO ?同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时
察看以前的记录啦。
备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候
把这个对象还原到存储起来的状态。
19、OBSERVER?? ?想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及
时收到情报啦
观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
20、STATE ?跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊
,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。
状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽
象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改
变所选的子类。
21、STRATEGY ?跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。
策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境
分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环

浙公网安备 33010602011771号