C#设计模式之---组合模式

组合模式(Composite Pattern)

组合模式(Composite Pattern)可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新部件也更容易,它让客户忽略了层次的不同性,而它的结构又是动态的,提供了对象管理的灵活接口。组合模式对于树结构的控制有着神奇的功效,用户对单个对象和组合对象的使用具有一致性。组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以像处理简单元素一样来处理复杂元素。也是一种结构型模式。

复制代码
using System;
using System.Text;
using System.Collections.Generic;
namespace ConsoleApplication
{
    //一般每个接口或类都写在单独的.cs文件中
    //本示例为了执行查看方便才写在一起  
   public abstract class FileObject
    {
        public string Name;
        public List<FileObject> filelist = new List<FileObject>();//组合
        public FileObject(string name)
        {
            this.Name = name;
        }
        //打印文件名
        public abstract void PrintName();
        public virtual void Add(FileObject fileobject)
        {
           Console.WriteLine("Add方法未重写");
        }
        public virtual void Remove(FileObject fileobject)
        {
           Console.WriteLine("Add方法未重写");
        }
    }
    public class txtFile:FileObject
    {
        public txtFile(string name)
            : base(name)
        { }
        public override void PrintName()
        {
            Console.WriteLine("文件名:" + base.Name); 
        }
    }
    public class docFile:FileObject
    {
        public docFile(string name):base(name)
        { }
        public override void PrintName()
        {
            Console.WriteLine("文件名:" + base.Name); 
        }
    }
    public class Folder:FileObject
    {
        public Folder(string name):base(name)
        { }
        public override void Add(FileObject fileobject)
        {
            filelist.Add(fileobject);
            Console.WriteLine(base.Name + "中添加了" + fileobject.Name);
        }
        public override void Remove(FileObject fileobject)
        {
            if (filelist.Remove(fileobject))
            {
                Console.WriteLine(base.Name + "中删除了" + fileobject.Name);
            }
            else
            {
                Console.WriteLine("删除失败!");
            }
        }
        public override void PrintName()
        {
            Console.WriteLine("文件名:" + base.Name); 
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            FileObject txt1 = new txtFile("txt1");
            FileObject txt2 = new txtFile("txt2");
            FileObject doc1 = new docFile("doc1");
            FileObject doc2 = new docFile("doc2");
            FileObject folder1 = new Folder("folder1");
            FileObject folder2 = new Folder("folder2");
            txt1.Add(txt2);
            doc1.Add(doc2);
            txt1.Remove(doc1);
            folder1.Add(txt1);
            folder1.Add(doc2);
            folder2.Add(folder1);
            folder2.Add(doc1);
            folder1.Remove(txt1);
            //打印folder1目录下的文件
            Console.WriteLine("-------------");
            foreach (FileObject file in folder1.filelist)
            {
                Console.WriteLine(file.Name);
            }
            //打印folder2目录下的文件
            Console.WriteLine("-------------");
            foreach (FileObject file in folder2.filelist)
            {
                Console.WriteLine(file.Name);
            }
            Console.ReadKey();
        }
    }
}
相关推荐
牵牛老人2 小时前
C++设计模式-责任链模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·责任链模式
肥仔哥哥19303 小时前
设计模式分类与定义(高软55)
设计模式·软考·高软·设计模式分类
云徒川6 小时前
【设计模式】过滤器模式
windows·python·设计模式
找了一圈尾巴16 小时前
设计模式(结构性)-代理模式
设计模式·代理模式
渊渟岳16 小时前
掌握设计模式--模板方法模式
设计模式
程序员JerrySUN1 天前
设计模式 Day 2:工厂方法模式(Factory Method Pattern)详解
设计模式·工厂方法模式
牵牛老人1 天前
C++设计模式-迭代器模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·迭代器模式
诺亚凹凸曼1 天前
23种设计模式-结构型模式-组合
设计模式
诺亚凹凸曼1 天前
23种设计模式-结构型模式-桥接器
android·java·设计模式
却尘2 天前
跨域资源共享(CORS)完全指南:从同源策略到解决方案 (1)
前端·设计模式