• 组合模式


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

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

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

  • 相关阅读:
    Linux进程状态——top,ps中看到进程状态D,S,Z的含义
    openstack-neutron基本的网络类型以及分析
    openstack octavia的实现与分析(二)·原理,架构与基本流程
    网络虚拟化基础协议·Geneve
    openstack octavia的实现与分析(一)·openstack负载均衡的现状与发展以及lvs,Nginx,Haproxy三种负载均衡机制的基本架构和对比
    Linux下多网卡绑定bond及模式介绍
    Python调试器-pdb的使用
    DELL R720服务器安装Windows Server 2008 R2 操作系统图文详解
    JAVA WEB实现前端加密后台解密
    JAVA实现AES和MD5加密
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1809545.html
Copyright © 2020-2023  润新知