zoukankan      html  css  js  c++  java
  • 组合模式

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

    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);

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

  • 相关阅读:
    Andrew Ng机器学习 二: Logistic Regression
    Andrew Ng机器学习 一: Linear Regression
    python爬有道翻译
    硬件学习之无刷电机理论1
    字符串优化处理
    缓冲&缓存&对象池概念的理解
    线程池的学习及使用
    线程同步&线程池
    数据类型转换&运算符
    集合中常用的数据结构
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1809545.html
Copyright © 2011-2022 走看看