开发手册 欢迎您!
软件开发者资料库

.NET(C#) 设计模式 组合模式

设计模式(Design pattern)是代码设计经验的总结。设计模式主要分三个类型:创建型、结构型和行为型。创建型是对象实例化的模式,创建型模式用于解耦对象的实例化过程,主要用于创建对象。结构型是把类或对象结合在一起形成一个更大的结构,主要用于优化不同类、对象、接口之间的结构关系。行为型是类和对象如何交互,及划分责任和算法。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。本文主要介绍.NET(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 filelist = new List();//组合        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();        }    }}