恋爱中的设计模式 之
合成模式
----Composite Pattern
Composite模式的核心特点:
以树型结构组织对象,用统一的方式处理“部分”与“整体”。
恋爱中的Composite模式:
――MM过生日,GG自然要送上礼物以表心意。
MM:“我过生日,你要送我一件礼物。”
GG:“嗯,好吧,去商店,你自己挑。”
MM:“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。”
GG:“喂,买了三件了呀,我只答应送一件礼物的哦。”
MM:“什么呀,T恤加裙子加包包 ,正好配成一套呀,小姐,麻烦你包起来。”
GG:“……”(口吐白沫,四肢抽搐,不省人事ing…)
“案情”分析:
该MM十分之聪明地运用了Composite模式,将3件礼物“合成”至1件(套),从而让GG以买一件礼物的方式(反正GG只要付一次钱~~)买了3件礼物。
由此不难看出,Composite将对象以树形结构组织起来,以达到“部分-整体”的层次结构,使得客户(钱包瘪瘪的GG)对单个对象和组合对象(1件vs1套)的使用具有一致性(付一次钱)
Composite模式的使用:
Composite比较简单,也很容易学习,当你面对一个树形结构的时候,脑筋就该多转一圈:是否可以在该结构中使用Composite模式?
如何去实现Composite模式呢?一种简单的方法是:定义一个公用的接口,让组合对象和单个对象都去实现该接口。因此,如果面对单个对象,则调用单个对象的方法;如果面对组合对象,递归遍历之,依次调用每个对象的方法;
单个对象:相当于树形结构中的叶节点,它不包含任何子对象
组合对象:相当于树形结构中的枝节点,它可以包含更小的枝对象,也可以包含叶对象
这里对含有环的情况不作讨论。
例示代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace Composite
{
interface IGift
{
void Pay();
void Add(IGift gift);
}
class GiftSingle : IGift
{
private string m_name;
public GiftSingle(string name)
{
m_name = name;
}
public void Add(IGift gift)
{
}
public void Pay()
{
Console.WriteLine("我买了" + m_name + "!hoho~~");
}
};
class GiftComposite : IGift
{
private string m_name;
List<IGift> m_gifts;
public GiftComposite()
{
m_name = string.Empty;
m_gifts = new List<IGift>();
}
public void Add(IGift gift)
{
m_gifts.Add(gift);
}
public void Pay()
{
foreach(IGift gift in m_gifts)
{
gift.Pay();
}
}
};
class Program
{
static void Main (string[] args)
{
//20岁生日,那时的MM还很单纯~~
Console.WriteLine("lalala~20岁生日来咯------------------------------------------");
IGift singleGift20 = new GiftSingle("手表");
singleGift20.Pay();
//22岁生日,MM变得狡诈" 了~~
Console.WriteLine("heiheihei~22岁生日来咯------------------------------------------");
IGift compositeGift22 = new GiftComposite();
//打包,打包!我要把所有喜欢的礼物打包成“一套”~
compositeGift22.Add(new GiftSingle("手机"));
compositeGift22.Add(new GiftSingle("DC"));
compositeGift22.Add(new GiftSingle("DV"));
compositeGift22.Pay();
//24岁生日………………天哪!
Console.WriteLine("hiahiahia~24岁生日来咯------------------------------------------");
//先逛商场一层~买化妆品!
IGift compositeGift24 = new GiftComposite();
//打包,打包!
compositeGift24.Add(new GiftSingle("香水"));
compositeGift24.Add(new GiftSingle("指甲油"));
compositeGift24.Add(new GiftSingle("眼影"));
//然后来到二层,看中了一套衣服~
IGift singleGift24 = new GiftSingle("衣服");
//因为只能买“一件”,所以“狡诈”的MM再次打包。。。
IGift totalGifts = new GiftComposite();
//我包,我包,我包包包!
totalGifts.Add(compositeGift24);
totalGifts.Add(singleGift24);
totalGifts.Pay();
}
}
}