也谈Composite模式
Composite模式(组合模式)
这个模式是很常见的一种模式,一般来讲这个模式主要用于将对象的组合,比如:树状目录的组合,一般我们一个聚合节点组合了多个其他的子节点,而子节点同时也可以作为一个聚合节点,这样层层嵌套,组合成为树状目录。那么Composite模式就是来解决这类组合的问题的。
先看一下类图:
很明显,IComponent作为Component和Composite的公用接口,他们共同拥有一样的行为,通俗的说就是,单独的Component可以作为一个组件,一个Composite也能作为一个组件。
注意:这里用接口明显不如抽象类好。我们知道,接口是代表相似的功能,抽象类是说明同属一个东西。这里他们都是组件,而不是他们都具有Add,Remove的功能(Component就没有实现Add这个功能)。
下面我们详细来看IComponent这个接口:
代码
public interface IComponent<T>
{
T Name { get; set; }
void Add(IComponent<T> item);
IComponent<T> Remove(T item);
IComponent<T> Find(T item);
void Display();
}
{
T Name { get; set; }
void Add(IComponent<T> item);
IComponent<T> Remove(T item);
IComponent<T> Find(T item);
void Display();
}
再来看看Component:
Component
public class Component<T>:IComponent<T>
{
public Component(T name)
{ this.Name = name; }
public T Name
{ get; set; }
public void Add(IComponent<T> item)
{
//无需实现,不是集合无法添加
throw new ApplicationException("不能添加");
}
public IComponent<T> Remove(T item)
{
//无需实现,不是集合无法添加
return this;
}
public IComponent<T> Find(T item)
{
//通过item找到这个IComponet<T>,就方便了集合中删除这个元素
if (Name.Equals(item))
return this;
else
return null;
}
public void Display()
{ Console.WriteLine(this.Name); }
}
{
public Component(T name)
{ this.Name = name; }
public T Name
{ get; set; }
public void Add(IComponent<T> item)
{
//无需实现,不是集合无法添加
throw new ApplicationException("不能添加");
}
public IComponent<T> Remove(T item)
{
//无需实现,不是集合无法添加
return this;
}
public IComponent<T> Find(T item)
{
//通过item找到这个IComponet<T>,就方便了集合中删除这个元素
if (Name.Equals(item))
return this;
else
return null;
}
public void Display()
{ Console.WriteLine(this.Name); }
}
在Component中,是无法实现remove和add方法的,因为他不是一个集合。find方法主要是为了实现通过item找到这个IComponent这个组件,其实是完全为Composite服务的。
最后是Composite:
Composite
public class Composite<T> : IComponent<T>
{
List<IComponent<T>> list;
public Composite(T name)
{
this.Name = name;
list = new List<IComponent<T>>();
}
#region IComponent<T> Members
public T Name
{ get; set;}
public void Add(IComponent<T> item)
{
this.list.Add(item);
}
public IComponent<T> Remove(T item)
{
//先找到名为item的IComponent这个组件,然后就可以直接在集合里删除
IComponent<T> holder = this.Find(item);
if(holder!=null)
{
list.Remove(holder);
}
return null;
}
public IComponent<T> Find(T item)
{
//先找自己
if (Name.Equals(item))
{
return this;
}
//再找这个集合里的其他组件
foreach (IComponent<T> c in this.list)
{
if (c.Find(item) != null)
return c;
}
return null;
}
public void Display()
{
//先实现自己的方法
Console.WriteLine(Name+"----");
//再遍历组件
foreach (IComponent<T> c in this.list)
{
c.Display();
}
}
#endregion
}
{
List<IComponent<T>> list;
public Composite(T name)
{
this.Name = name;
list = new List<IComponent<T>>();
}
#region IComponent<T> Members
public T Name
{ get; set;}
public void Add(IComponent<T> item)
{
this.list.Add(item);
}
public IComponent<T> Remove(T item)
{
//先找到名为item的IComponent这个组件,然后就可以直接在集合里删除
IComponent<T> holder = this.Find(item);
if(holder!=null)
{
list.Remove(holder);
}
return null;
}
public IComponent<T> Find(T item)
{
//先找自己
if (Name.Equals(item))
{
return this;
}
//再找这个集合里的其他组件
foreach (IComponent<T> c in this.list)
{
if (c.Find(item) != null)
return c;
}
return null;
}
public void Display()
{
//先实现自己的方法
Console.WriteLine(Name+"----");
//再遍历组件
foreach (IComponent<T> c in this.list)
{
c.Display();
}
}
#endregion
}
在Composite中,是组合模式的重点。
好了,以上就是关于Component模式的一个实例。