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

本文通过鸭子模拟器实例,展示了如何运用适配器模式、工厂模式、组合模式、装饰模式及观察者模式解决软件开发中的实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

概述

    设计模式,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)

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值