《Head First Design Patterns》笔记十四:复合模式(Compound Pattern)

 

概述

    设计模式,GOF给出23个模式,《Head First Design Patterns》主要描述了其中的13个模式。我们一般应用软件,很少有只用1中模式的,往往都是几个模式一起用。这就是复合模式。其实,我们在应用模 式的时候大概每个人都已经在使用复合模式了。

     还是来看实例吧,主角我们还是选用可爱的鸭子,

模式应用实例

  我们来做个鸭子模拟器吧

step 1 :首先是主角出场,红头鸦,绿头鸭,鸭鸣器,还有最拉风的橡皮鸭。有请(如下):

要求很简单,就需要会叫,就可以了,好,我们动手吧,先来接口IQuackable,然后逐一实现MallardDuck, RedHeadDuck, DuckCall, RubberDuck 就可以了。代码如下

IQuackable.cs 定义接口

MallardDuck.cs

RedHeadDuck.cs

DuckCall.cs

RubberDuck.cs

DuckSimulator.cs 实现鸭子模拟器

运行Program.cs

运行结果如下:

Quack
Quack
Quack
Squeack

 

Step 2:适配器模式

  上面模拟的很好,现在来个了不和谐的客人了,看,谁来了

           

  鹅大妈可不会Quack Quack 叫,她只会Honk Honk,还会咬人,我小时候贼怕鹅,不过咬人这点这里就略过了

  呵呵,那怎么办呢,是用适配器模式的时候了,

  这里给出2段代码Goose.cs,GooseAdapter.cs

goose.cs

GooseAdapter.cs

 

 要创建Goose,只需要建立new GooseAdapter(new Goose()),就可以鱼目混珠,混在鸭子堆中。

Step 3:工厂模式

  要做到简单,能不能让客户不需要操心怎么new的细节,而是直接调用呢,那就是工厂模式了。

  先建立一个enum枚举类型

 

然后创建工厂

 

program如下

现在所有鸭子的创建部分由工厂负责了。


STEP 4:组合模式

  现在有新的要求了,考虑鸭子太多了,不好管理,能不能让它们组成一个个组合,几只鸭子组成1队,多个队或单独鸭子也同样可以组队。

这样当模拟的时候,直接调用队列就可以了,而不需要一只只鸭子的调用。

  ok,这就是组合模式了。

  我们先来创建2个类,1个singleQuack,一个QuackArray

QuackArray.cs:

这2个类都同时继承与IQuackable

然后我们改写鸭子的实现,以DuckCall为例,如下

 

Program.cs改写如下

这里调用鸭子不再需要1个1个调用了,直接一句Simulator.SimDuck(duckArray)就搞定。

Step 5:装饰模式

   现在老板又突发奇想了,要给每只鸭子装1个计数器,鸭子没叫1次,计数器就加1,最后需要知道所有鸭子总共叫了多少次。

ok,这是个新功能了。要给1件事务加新功能,新行为,用Decorator装饰者模式不错

   我们来创建装饰品QuackCounter.cs

在改写Factory

当需要调用带计数器的鸭子的时候,直接调用CreateCounterDuck(...)

Step 5:观察者模式

  新需求来了。我们的鸭子专家现在需要远程监控鸭子的行为。每当鸭子叫一下,专家就即时获得消息,ok,这就是事件了,鸭子一叫就触发了事件。这根本也就是观察者模式。

  我们现在要给所有鸭子加上事件了,那就是改鸭子的父类了

  首先修改接口IQuackable,给接口加上event

 

 

  然后鸭子父类SingleDuck.cs

 

 在就是鸭子组合QuackArray了,注意,这里鸭子组合当注册事件的时候,实际上是给所有组合里的鸭子/鸭子组 注册事件

如下

  还有就是QuackCounter了,别忘了给它重写事件,这里counter注册事件的时候,实际上是给鸭子本体注册时间,而不是这个装饰品。

如下:

 

Program.cs如下

结果:

Quack
FUZHEPING.DesignPatterns.CompoundPatterns.MallardDuck just quacked
Quack
FUZHEPING.DesignPatterns.CompoundPatterns.RedHeadDuck just quacked
Quack
FUZHEPING.DesignPatterns.CompoundPatterns.DuckCall just quacked
Squeack
FUZHEPING.DesignPatterns.CompoundPatterns.RubberDuck just quacked
Honk
FUZHEPING.DesignPatterns.CompoundPatterns.GooseAdapter just quacked
Honk
FUZHEPING.DesignPatterns.CompoundPatterns.GooseAdapter just quacked
Honk
FUZHEPING.DesignPatterns.CompoundPatterns.GooseAdapter just quacked
the count of quack is 6

 

 

下一篇:《Head First Design Patterns》笔记十五:MVC

上一篇:《Head First Design Patterns》笔记十三:代理模式(Proxy Pattern)

 

 

 

 

 

 

 

 

 

 

 

 

 

Head First设计模式》作者Eric Freeman;ElElisabeth Freeman是作家、讲师和技术顾问。本书的产品设计应用神经生物学、认知科学,以及学习理论,这使得这本书能够将这些知识深深地印在你的脑海里,不容易被遗忘。本书的编写方式采用引导式教学。以大量的生活化故事当背景,以图片做背景,阅读起来生动有趣。书中模式告白节目,将设计模式拟人化成节目来宾,畅谈其内在的一切。 《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton,Command、Adapter、Facade、TemplateMethod、Iterator、Composite、State、Proxy。最后三章比较特别。第12章介绍如何将两个以上的设计模式结合起来成为新的设计模式(例如著名的MVC模式),作者称其为复合设计模式(这是作者自创的名称,并非四人组的标准名词),第13章介绍如何进一步学习设计模式,如何发觉新的设计模式等主题,至于第14章则很快地浏览尚未介绍的设计模式,包括Bridge、Builder、Chain of Responsibility、Flyweight、Interpreter、Mediator、Memento、Prototype,Visitor。第1章还介绍了四个○○基本概念(抽象、封装、继承、多态),而第1章到第9章也陆续介绍了九个○○原则(Principle)。千万不要轻视这些○○原则,因为每个设计模式背后都包含了几个○○原则的概念。很多时候,在设计时有两难的情况,这时候我们必须回归到○○原则,以方便判断取舍。可以这么说:○○原则是我们的目标,而设计模式是我们的做法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值