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

    组合模式:将对象组合成树形结构以表示“部分-真题”的结构层次。组合模式使得用户对单个对象和组合对象的使用具有一致性。

    结构图:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Text;
      4 
      5 namespace 组合模式
      6 {
      7     class Program
      8     {
      9         static void Main(string[] args)
     10         {
     11             Composite root = new Composite("root");
     12             root.Add(new Leaf("Leaf A"));
     13             root.Add(new Leaf("Leaf B"));
     14 
     15             Composite comp = new Composite("Composite X");
     16             comp.Add(new Leaf("Leaf XA"));
     17             comp.Add(new Leaf("Leaf XB"));
     18 
     19             root.Add(comp);
     20 
     21             Composite comp2 = new Composite("Composite XY");
     22             comp2.Add(new Leaf("Leaf XYA"));
     23             comp2.Add(new Leaf("Leaf XYB"));
     24 
     25             comp.Add(comp2);
     26 
     27             root.Add(new Leaf("Leaf C"));
     28 
     29             Leaf leaf = new Leaf("Leaf D");
     30             root.Add(leaf);
     31             root.Remove(leaf);
     32 
     33             root.Display(1);
     34 
     35             Console.Read();
     36         }
     37     }
     38 
     39     abstract class Component
     40     {
     41         protected string name;
     42 
     43         public Component(string name)
     44         {
     45             this.name = name;
     46         }
     47 
     48         public abstract void Add(Component c);
     49         public abstract void Remove(Component c);
     50         public abstract void Display(int depth);
     51     }
     52 
     53     class Composite : Component
     54     {
     55         private List<Component> children = new List<Component>();
     56 
     57         public Composite(string name)
     58             : base(name)
     59         { }
     60 
     61         public override void Add(Component c)
     62         {
     63             children.Add(c);
     64         }
     65 
     66         public override void Remove(Component c)
     67         {
     68             children.Remove(c);
     69         }
     70 
     71         public override void Display(int depth)
     72         {
     73             Console.WriteLine(new String('-', depth) + name);
     74 
     75             foreach (Component component in children)
     76             {
     77                 component.Display(depth + 2);
     78             }
     79         }
     80     }
     81 
     82     class Leaf : Component
     83     {
     84         public Leaf(string name)
     85             : base(name)
     86         { }
     87 
     88         public override void Add(Component c)
     89         {
     90             Console.WriteLine("Cannot add to a leaf");
     91         }
     92 
     93         public override void Remove(Component c)
     94         {
     95             Console.WriteLine("Cannot remove from a leaf");
     96         }
     97 
     98         public override void Display(int depth)
     99         {
    100             Console.WriteLine(new String('-', depth) + name);
    101         }
    102     }
    103 }
    Composite

    当你发现需求中是体现部分与整体的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的多有对象时,就应该考虑用组合模式。

  • 相关阅读:
    主线程MainThread与渲染线程RenderThread
    杀死进程的几种方式
    Android App的设计架构:MVC,MVP,MVVM与架构经验谈
    动画完全解析(二):补间动画原理及自定义动画
    SublimeText教程
    JqGrid自定义的列
    js 除法 取整
    js日期字符串增加天数的函数
    Oracle中的rownum和rowid
    jQuery判断对象是否是函数
  • 原文地址:https://www.cnblogs.com/virus1102/p/Composite.html
Copyright © 2011-2022 走看看