学习C#设计模式(十二)组合模式

组合模式

using System;
using System.Collections.Generic;

namespace Composite
{
    //抽象地区类
    public abstract class Area
    {
        protected string name;
        public Area(string name) { this.name = name; }
        public abstract void Add(Area area);             //抽象添加区域
        public abstract void Remove(Area area);          //抽象删除区域
        public abstract void Perform();                  //抽象执行方法
    }

    //果农
    public class Orchardist : Area
    {

        public Orchardist(string name) : base(name) { }
        public override void Add(Area area) { }              //添加区域
        public override void Remove(Area area) { }           //删除区域
        public override void Perform()                       //执行方法
        {
            Console.WriteLine("{0}的果农采摘水果!", name);
        }
    }
    //水果销售商类
    public class FruitSeller : Area
    {
        public FruitSeller(string name) : base(name) { }
        public override void Add(Area area) { }              //添加区域
        public override void Remove(Area area) { }           //删除区域
        public override void Perform()                       //执行方法
        {
            Console.WriteLine("{0}的水果销售者销售水果!", name);
        }
    }

    //具体区域类
    public class ConcreteArea : Area
    {
        List<Area> areas = new List<Area>();             //区域列表
        public ConcreteArea(string name) : base(name) { }
        public override void Add(Area area)              //添加区域
        {
            areas.Add(area);
        }
        public override void Remove(Area area)               //删除区域
        {
            areas.Remove(area);
        }
        public override void Perform()                   //执行所有区域的执行方法
        {
            Console.WriteLine(name);
            foreach (var area in areas)
            {
                area.Perform();
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Area bjArea = new ConcreteArea("--北京水果总部--");                //创建北京水果总部实例
            Area hzSeller = new ConcreteArea("---北京水果销售分部---");        //创建北京水果销售分部实例
            Area hzOrchardist = new ConcreteArea("---北京水果采摘分部---");    //创建北京水果采摘分部
            bjArea.Perform();                                                
            bjArea.Add(hzSeller);                                              //添加北京水果销售分部
            bjArea.Add(hzOrchardist);                                          //添加北京水果采摘分部
            hzSeller.Add(new FruitSeller("东城区"));                           //添加东城区
            hzSeller.Add(new FruitSeller("西城区"));                           //添加西城区
            hzSeller.Perform();
            hzOrchardist.Add(new Orchardist("海淀区"));                        //添加海淀区
            hzOrchardist.Add(new Orchardist("朝阳区"));                        //添加朝阳区
            hzOrchardist.Perform();

            Console.ReadKey();
        }
    }
}

代码解析:
本实例代码实现了组合模式,首先创建了抽象类Area,该类是所有节点元素的基类;然后创建了Area类的派生类Orchardist和FruitSeller,这两个类主要是树形结构的叶子节点;还创建了Area类的派生类ConcreteArea,该类表示的是树形结构的中间节点,该类中含有Area的集合,用于存放其子节点,其子节点可以是叶子节点,也可以是中间节点,在调用其 Perform方法的同时还会调用其所有子节点的Perform方法。Area类中还有Add方法和Remove方法为其添加和删除子节点。通过Orchardist类、FruitSeller类和ConcreteArea类可以构建一个完整的类的树形结构。这就是组合模式。

说明:
组合模式的主要功能是将具有层级结构关系的类实例组合成树形结构,并提供一致的访问接口。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值