JAVA设计模式之组合模式

简介

将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
使用情况
当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。

那就拿我剪发办卡的事情来分析一下吧。

首先,一张卡可以在总部,分店,加盟店使用,那么总部可以刷卡,分店也可以刷卡,加盟店也可以刷卡,这个属性结构的店面层级关系就明确啦。

那么,总店刷卡消费与分店刷卡消费是一样的道理,那么总店与分店对会员卡的使用也具有一致性。

组合模式结构图

这里写图片描述

代码实现

//抽象的部件类描述将来所有部件共有的行为
    public abstract class Component
    {
        protected string name;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        //添加部件
        public abstract void Add(Component component);
        //删除部件
        public abstract void Remove(Component component);
        //遍历所有子部件
        public abstract void eachChild();
    }

    //组合部件类
    public class Leaf : Component
    {
        //叶子节点不具备添加的能力,所以不实现
        public override void Add(Component component)
        {
            throw new NotImplementedException();
        }

        //叶子节点不具备添加的能力必然也不能删除
        public override void Remove(Component component)
        {
            throw new NotImplementedException();
        }

        //叶子节点没有子节点所以显示自己的执行结果
        public override void eachChild()
        {
            Console.WriteLine("{0}执行了..",name);
        }
    }

    //组合类
    public class Composite : Component
    {
        //用来保存组合的部件
        List<Component> myList = new List<Component>();

        //添加节点 添加部件
        public override void Add(Component component)
        {
            myList.Add(component);
        }

        //删除节点 删除部件
        public override void Remove(Component component)
        {
            myList.Remove(component);
        }

        //遍历子节点
        public override void eachChild()
        {
            Console.WriteLine("{0}执行了..", name);
            foreach (Component c in myList)
            {
                c.eachChild();
            }
        }
    }
    static void Main(string[] args)
    {
            //构造根节点
            Composite rootComponent = new Composite();
            rootComponent.Name = "根节点";

            //添加两个叶子几点,也就是子部件
            Leaf l = new Leaf();
            l.Name = "叶子节点一";
            Leaf l1 = new Leaf();
            l1.Name = "叶子节点二";

            rootComponent.Add(l);
            rootComponent.Add(l1);

            //遍历组合部件
            rootComponent.eachChild();
     }

结果

根节点执行了
叶子节点一执行了
叶子节点二执行了

应用:会员卡消费

首先:

1.我们的部件有,总店,分店,加盟店!
2.我们的部件共有的行为是:刷会员卡
3.部件之间的层次关系,也就是店面的层次关系是,总店下有分店、分店下可以拥有加盟店。

有了我们这几个必要条件后,我的要求就是目前店面搞活动当我在总店刷卡后,就可以累积相当于在所有下级店面刷卡的积分总额,设计的代码如下:

  // 店面类 抽象出来的店面部件

    public abstract class Storefront
    {
        //店名
        protected string storeName = string.Empty;
        public string StoreName
        {
            get
            {
                return storeName;
            }
        }

        //添加店面
        public abstract void Add(Storefront store);
        //删除店面
        public abstract void Remove(Storefront store);

        //定义所有部件公用的行为 刷卡行为
        public abstract void PayByCard();
    }

    public class StoreOrBranch : Storefront
    {
        //构造函数
        public StoreOrBranch() { }
        public StoreOrBranch(string storeName)
        {
            this.storeName = storeName;
        }
        List<Storefront> myStoreList = new List<Storefront>();
        //刷卡消费
        public override void PayByCard()
        {
            Console.WriteLine("店面{0}的积分已累加进该会员卡", storeName);
            foreach (Storefront sf in myStoreList)
            {
                sf.PayByCard();
            }
        }

        //增加店面
        public override void Add(Storefront store)
        {
            myStoreList.Add(store);
        }

        //解除店面
        public override void Remove(Storefront store)
        {
            myStoreList.Remove(store);
        }
    }

    public class JoinInStore : Storefront
    {
        //构造函数
        public JoinInStore() { }
        public JoinInStore(string storeName)
        {
            this.storeName = storeName;
        }
        //刷卡消费
        public override void PayByCard()
        {
            Console.WriteLine("店面{0}的积分已累加进该会员卡", storeName);
        }

        public override void Add(Storefront store)
        {
            throw new NotImplementedException();
        }

        public override void Remove(Storefront store)
        {
            throw new NotImplementedException();
        }
    }

   static void Main(string[] args)
   {
            StoreOrBranch store = new StoreOrBranch("朝阳总店");
            StoreOrBranch brach = new StoreOrBranch("东城分店");
            JoinInStore jstore = new JoinInStore("海淀加盟店一");
            JoinInStore jstore1 = new JoinInStore("上地加盟店二");

            brach.Add(jstore);
            brach.Add(jstore1);
            store.Add(brach);

            store.PayByCard();
    }

执行结果

店面朝阳总店的积分已累加进该会员卡、
店面东城分店的积分已累加进该会员卡
店面海淀加盟店一的积分已累加进该会员卡
店面上地加盟店二的积分已累加进该会员卡
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值