恋爱中的设计模式 之 Composite模式 (合成模式)

 

恋爱中的设计模式

合成模式

----Composite Pattern

 

Composite模式的核心特点:

       以树型结构组织对象,用统一的方式处理“部分”与“整体”。

 

恋爱中的Composite模式:

――MM过生日,GG自然要送上礼物以表心意。

MM我过生日,你要送我一件礼物。

GG嗯,好吧,去商店,你自己挑。

MM这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。

GG喂,买了三件了呀,我只答应送一件礼物的哦。

MM什么呀,T恤加裙子加包包 ,正好配成一套呀,小姐,麻烦你包起来。

GG“……”(口吐白沫,四肢抽搐,不省人事ing…

 

“案情”分析:

       MM十分之聪明地运用了Composite模式,将3件礼物“合成”至1件(套),从而让GG以买一件礼物的方式(反正GG只要付一次钱~~)买了3件礼物。

 

       由此不难看出,Composite将对象以树形结构组织起来,以达到“部分-整体”的层次结构,使得客户(钱包瘪瘪的GG)对单个对象和组合对象(1vs1套)的使用具有一致性(付一次钱)

 

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();

        }

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值