llopx

能跟您分享知识,是我的荣幸

也谈Composite模式

Composite模式(组合模式)

这个模式是很常见的一种模式,一般来讲这个模式主要用于将对象的组合,比如:树状目录的组合,一般我们一个聚合节点组合了多个其他的子节点,而子节点同时也可以作为一个聚合节点,这样层层嵌套,组合成为树状目录。那么Composite模式就是来解决这类组合的问题的。

先看一下类图:

很明显,IComponent作为Component和Composite的公用接口,他们共同拥有一样的行为,通俗的说就是,单独的Component可以作为一个组件,一个Composite也能作为一个组件。

注意:这里用接口明显不如抽象类好。我们知道,接口是代表相似的功能,抽象类是说明同属一个东西。这里他们都是组件,而不是他们都具有Add,Remove的功能(Component就没有实现Add这个功能)。

下面我们详细来看IComponent这个接口:

 

代码
    public interface IComponent<T>
    {
        T Name { 
getset; }
        
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
        {   
getset;  }

        
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
        { 
getset;}

        
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模式的一个实例。

posted on 2009-12-13 12:04  llopx  阅读(372)  评论(0编辑  收藏  举报

导航