2009年10月14日星期三

Composite设计模式

计算机文件系统中,目录中可以有文件或者目录,所以目录是一个递归定义事物。目录和文件是不同的对象但是有很多相似的性质,对用户来说,都有名称,可以删除等等。删除一个目录或者文件,对用户来说可以不用区分,执行相同的操作。
Composite 设计模式就是将容器(目录)和容器中的内容(文件)作为相同的对象来处理的设计模式,主要针对递归构造的处理对象。
下面演示用Composite设计模式实现的文件目录的构建,删除和递归显示的程序。

static void Main()
{
/*构建一个下图所示的目录结构,-的长短代表目录的层次。
* -root
* ---File A
* ---File B
* ---Directory
* -----File XA
* -----File XB
* ---File C
*/
Directory root = new Directory("root");
root.Add(new File("File A"));
root.Add(new File("File B"));
Directory comp = new Directory("Directory X");
comp.Add(new File("File XA"));
comp.Add(new File("File XB"));
root.Add(comp);
root.Add(new File("File C"));
// Add and remove a File
File file = new File("File D");
root.Add(file);
root.Remove(file);
// Recursively display tree
root.Display(1);
// Wait for user
Console.ReadKey();
}
}
//文件和目录的共同抽象类-->将文件和目录看作同一个事物的基础
//定义了 添加 删除 显示接口
abstract class Component
{
protected string name;
// Constructor
public Component(string name)
{
this.name = name;
}
public abstract void Add(Component c);
public abstract void Remove(Component c);
public abstract void Display(int depth);
}
//实现目录类
class Directory : Component
{
//定义了一个序列,用来放Componet(文件/目录)。
private List _children = new List();
// Constructor
public Directory(string name)
: base(name)
{
}
//向目录中添加文件或目录
public override void Add(Component component)
{
_children.Add(component);
}
//从目录中移除文件或目录
public override void Remove(Component component)
{
_children.Remove(component);
}
//递归显示该目录下的所有文件或目录。
public override void Display(int depth)
{
Console.WriteLine(new String('-', depth) + name);
// Recursively display child nodes
foreach (Component component in _children)
{
component.Display(depth + 2);
}
}
}
//实现文件类
class File : Component
{
// Constructor
public File(string name)

: base(name)
{
}
//文件中不能添加文件。
public override void Add(Component c)
{
Console.WriteLine("Cannot add to a file");
}
//文件只能从目录中移除。
public override void Remove(Component c)
{
Console.WriteLine("Cannot remove from a File");
}
//显示文件路径
public override void Display(int depth)
{
Console.WriteLine(new String('-', depth) + name);
}
}

执行结果:
-root
---File A
---File B
---Directory X
-----File XA
-----File XB
---File C

没有评论:

发表评论