代码改变世界

组合模式

2010-08-26 22:16  Clingingboy  阅读(763)  评论(0编辑  收藏  举报

      将对象以部分-整体的形式组成,如画图,可以画圆,画线,然后组成一幅图片,与装饰部同的是,这里是组合,装饰是扩展,组合模式是一个行为了的整合。但其又统一了部分和整体操作接口的统一性.

image_2

接口

// The Interface
 public interface IComponent <T> {
   void Add(IComponent <T> c);
   IComponent <T> Remove(T s);
   string Display(int depth);
   IComponent <T> Find(T s);
   T Name {get; set;}
 }

整体对象Composite

public class Composite <T> : IComponent  <T> {
       List  <IComponent <T>> list = null;
 
       public T Name {get; set;}
     
       public Composite (T name)  { 
         Name = name;
         list = new List <IComponent <T>> ();
       }
 
       public void Add(IComponent  <T> c) {
         list.Add(c);
       }
 
       // Finds the item from a particular point in the structure
       // and returns the composite from which it was removed
       // If not found, return the point as given
       public IComponent <T> Remove(T s) {
         holder = this;
         IComponent <T> p = holder.Find(s);
         if (holder!=null) {
            (holder as Composite<T>).list.Remove(p);
            return holder;
         }
         else 
            return this;
       }
     
       IComponent <T> holder=null;
     
       // Recursively looks for an item
       // Returns its reference or else null
       public IComponent <T>  Find (T s) {
         holder = this;
         if (Name.Equals(s)) return this;
         IComponent <T> found=null;
         foreach (IComponent <T> c in list)  {
           found = c.Find(s);
           if (found!=null) 
             break;
         }
         return found;
       }
     
       // Displays items in a format indicating their level in the composite structure
       public string Display(int depth) {
         StringBuilder s = new StringBuilder(new String('-', depth));
         s.Append("Set "+ Name +  " length :" + list.Count + "\n");
         foreach (IComponent <T> component in list) {
           s.Append(component.Display(depth + 2));
         }
         return s.ToString();
       }
     }

局部对象,注意这里的Add和Remove方法是无效的,因为其非集合.所以接口的这两个方法也是可以去掉的.

// The Component
 public class Component <T> : IComponent <T> {
   public T Name {get; set;}
 
   public Component (T name)  { 
     Name = name;
   }
 
   public void Add(IComponent <T> c) {
     Console.WriteLine("Cannot add to an item");
   }
 
   public IComponent <T>  Remove(T s) {
     Console.WriteLine("Cannot remove directly");
     return this;
   }
 
   public string Display(int depth) {
   return new String('-', depth) + Name+"\n";
   }
 
   public IComponent <T>  Find (T s) {
     if (s.Equals(Name)) 
       return this; 
     else 
         return null;
   }
 }

客户端调用

IComponent <string> album = new Composite<string> ("Album");    
 album.Add(new Component<string>("home.jpg"));
 album.Add(new Component<string>("home2.jpg"));
 album.Display(0);

这样的设计有助于减少整体的复杂性