zoukankan      html  css  js  c++  java
  • C#设计模式读书笔记之合成模式

    合成模式中有可能存在二个对象,Composite对象和Leaf对象,Composite对象中能包含Composite对象和Leaf对象,但是Leaf却只能独立存在。在运用合成模式进行建模时候,必须要掌握两个思想,一,在设计对象组的时候,既应该可以包容单个的基本对象,也可以包容其它的对象组。二、单个的基本对象和对象组都应该定义公共的行为,并将这个对象组描述为包容了这个类型的对象的集合。


    在合成模式的原型图中,涉及到三个角色:
    1、抽象构件(Component),这是给出的一个公共接口,规定了参与组合的对象的默认行为。
    2、合成构件(Composite),参加组合的有子对象的对象,并给出了合成构件的行为。
    3、基本构件(Leaf),参加组合的没有子对象的对象。

    合成模式根据所实现的接口的不同。分为了安全模式和透明模式,
    安全模式是指在Composite构件中实现管理子类对象的方法,如Add,Remove,GetChild等方法,这样在Leaf中就无法实现这些方法,即使有实现也不能通过编译,这样就达到了代码的安全。不够透明,Composite和Leaf对象使用不同的接口



     1using System;
     2using System.Text;
     3using System.Collections;
     4
     5// "Component"
     6abstract class Component
     7{
     8  // Fields
     9  protected string name;
    10
    11  // Constructors
    12  public Component( string name )
    13  {
    14    this.name = name;
    15  }

    16
    17  // Operation
    18  public abstract void Display( int depth );
    19}

    20
    21// "Composite"
    22class Composite : Component
    23{
    24  // Fields
    25  private ArrayList children = new ArrayList();
    26
    27  // Constructors
    28  public Composite( string name ) : base( name ) {}
    29
    30  // Methods
    31  public void Add( Component component )
    32  {
    33    children.Add( component );
    34  }

    35  public void Remove( Component component )
    36  {
    37    children.Remove( component );
    38  }

    39  public override void Display( int depth )
    40  {
    41    Console.WriteLine( new String( '-', depth ) + name );
    42
    43    // Display each of the node's children
    44    foreach( Component component in children )
    45      component.Display( depth + 2 );
    46  }

    47}

    48
    49// "Leaf"
    50class Leaf : Component
    51{
    52  // Constructors
    53  public Leaf( string name ) : base( name ) {}
    54
    55  // Methods
    56  public override void Display( int depth )
    57  {
    58    Console.WriteLine( new String( '-', depth ) + name );
    59  }

    60}

    61
    62/**//// <summary>
    63/// Client test
    64/// </summary>

    65public class Client
    66{
    67  public static void Main( string[] args )
    68  {
    69    // Create a tree structure
    70    Composite root = new Composite( "root" );
    71    root.Add( new Leaf( "Leaf A" ));
    72    root.Add( new Leaf( "Leaf B" ));
    73    Composite comp = new Composite( "Composite X" );
    74
    75    comp.Add( new Leaf( "Leaf XA" ) );
    76    comp.Add( new Leaf( "Leaf XB" ) );
    77    root.Add( comp );
    78
    79    root.Add( new Leaf( "Leaf C" ));
    80
    81    // Add and remove a leaf
    82    Leaf l = new Leaf( "Leaf D" );
    83    root.Add( l );
    84    root.Remove( l );
    85
    86    // Recursively display nodes
    87    root.Display( 1 );
    88  }

    89}

    透明模式,是指在接口中给出所有管理子类的方法,在Composite和Leaf中都能实现这些方法,但是如果在Leaf类中不正确的实现了这些方法,将不能在编译中被检查出来,而在运行时报错。


     1using System;
     2using System.Text;
     3using System.Collections;
     4
     5// "Component"
     6abstract class Component
     7{
     8  // Fields
     9  protected string name;
    10
    11  // Constructors
    12  public Component( string name )
    13  this.name = name; }
    14
    15  // Methods
    16  abstract public void Add(Component c);
    17  abstract public void Remove( Component c );
    18  abstract public void Display( int depth );
    19}

    20
    21// "Composite"
    22class Composite : Component
    23{
    24  // Fields
    25  private ArrayList children = new ArrayList();
    26
    27  // Constructors
    28  public Composite( string name ) : base( name ) {}
    29
    30  // Methods
    31  public override void Add( Component component )
    32  { children.Add( component ); }
    33  
    34  public override void Remove( Component component )
    35  { children.Remove( component ); }
    36  
    37  public override void Display( int depth )
    38  
    39    Console.WriteLine( new String( '-', depth ) + name );
    40
    41    // Display each of the node's children
    42    foreach( Component component in children )
    43      component.Display( depth + 2 );
    44  }

    45}

    46
    47// "Leaf"
    48class Leaf : Component
    49{
    50  // Constructors
    51  public Leaf( string name ) : base( name ) {}
    52
    53  // Methods
    54  public override void Add( Component c )
    55  { Console.WriteLine("Cannot add to a leaf"); }
    56
    57  public override void Remove( Component c )
    58  { Console.WriteLine("Cannot remove from a leaf"); }
    59
    60  public override void Display( int depth )
    61  { Console.WriteLine( new String( '-', depth ) + name ); }
    62}

    63
    64/**//// <summary>
    65/// Client test
    66/// </summary>

    67public class Client
    68{
    69  public static void Main( string[] args )
    70  {
    71    // Create a tree structure
    72    Composite root = new Composite( "root" );
    73    root.Add( new Leaf( "Leaf A" ));
    74    root.Add( new Leaf( "Leaf B" ));
    75    Composite comp = new Composite( "Composite X" );
    76
    77    comp.Add( new Leaf( "Leaf XA" ) );
    78    comp.Add( new Leaf( "Leaf XB" ) );
    79    root.Add( comp );
    80
    81    root.Add( new Leaf( "Leaf C" ));
    82
    83    // Add and remove a leaf
    84    Leaf l = new Leaf( "Leaf D" );
    85    root.Add( l );
    86    root.Remove( l );
    87
    88    // Recursively display nodes
    89    root.Display( 1 );
    90  }

    91}

    以上全部是借的吕老师的代码,下面的就是我自己写的了。两点了,也来不及测试了。明天再看看。
     1using System;
     2using Systme.Collection;
     3
     4abstract class Component
     5{
     6   abstract public void AddMatchine
     7   abstract public  int  GetMatchineCount();
     8}

     9
    10class Composite:Component
    11{
    12   ArrayList List=new ArrayList();
    13   public override void AddMatchine(Component c)
    14   {
    15     List.Add(c);
    16   }

    17   public override int GetMatchineCount()
    18   {
    19      int count=0;
    20      foreach(Component o in List)
    21       {
    22          Count+= o.GetMatchineCount();   
    23       }

    24   }

    25}

    26
    27class MatchineComponent:Component
    28{
    29   public override int GetMatchineCount()
    30   {
    31        return 1;
    32   }

    33}

    34
  • 相关阅读:
    Oil Deposits UVA
    工作区的颜值选择(中等)
    计算机网络 自定向下方法1.1-1.2
    工作区的颜值选择(简单)
    排序算法之简单选择排序
    排序算法之直接插入排序
    查找算法之查找一个数组中只出现过一次的数
    查找算法之查找一个数组中两两数字相同,只有其中两个数字是不一样的,将其找出
    Linux
    ASP.NET Web – 状态管理
  • 原文地址:https://www.cnblogs.com/xxm/p/454242.html
Copyright © 2011-2022 走看看