C# design pattern --- combination mode

Composite Pattern¶

Composite Pattern can clearly define hierarchical complex objects, express all or part of the hierarchy of objects, and make it easier to add new components. It allows customers to ignore the differences in hierarchy, and its structure is dynamic. , providing a flexible interface for object management. The combination mode has a magical effect on the control of the tree structure, and the user has consistency in the use of single objects and combined objects. The composite pattern decouples the client program from the internal structure of complex elements, so that the client program can handle complex elements as simple elements. It is also a structural model.

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

 

Guess you like

Origin blog.csdn.net/lwf3115841/article/details/131797451