Composite_Model
抽象类Component适当情况下实现所有类公共接口的默认行为。声明一个接口用于管理和访问Component的子部件
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace Composite_Model
{
abstract class Component
{
protected string name;
public Component ( string name)
{
this . name = name;
}
public abstract void Add ( Component c) ;
public abstract void Remove ( Component c) ;
public abstract void DisPlay ( int depth) ;
}
}
Leaf在组合中表示叶节点对象,叶节点没有子节点(叶子类)
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace Composite_Model
{
class Leaf : Component
{
public Leaf ( string name) : base ( name)
{
}
public override void Add ( Component c)
{
Console. WriteLine ( "Cannot add to a leaf" ) ;
}
public override void DisPlay ( int depth)
{
Console. WriteLine ( new String ( '-' , depth) + name) ;
}
public override void Remove ( Component c)
{
Console. WriteLine ( "Cannot remove from a leaf" ) ;
}
}
}
Composite为枝节点行为,用来存储子部件,在Component接口中实现与子部件有关的操作、如Add Remove。(分支类)
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace Composite_Model
{
class Composite : Component
{
private IList< Component> children = new List < Component > ( ) ;
public Composite ( string name) : base ( name)
{
}
public override void Add ( Component c)
{
children. Add ( c) ;
}
public override void DisPlay ( int depth)
{
Console. WriteLine ( new String ( '-' , depth) + name) ;
foreach ( Component c in children)
{
c. DisPlay ( depth + 2 ) ;
}
}
public override void Remove ( Component c)
{
children. Remove ( c) ;
}
}
}
客户端
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace Composite_Model
{
class Program
{
static void Main ( string [ ] args)
{
Composite root = new Composite ( "root" ) ;
root. Add ( new Leaf ( "LeafA" ) ) ;
root. Add ( new Leaf ( "LeafB" ) ) ;
Composite comp = new Composite ( "Composite X" ) ;
comp. Add ( new Leaf ( "Leaf XA" ) ) ;
comp. Add ( new Leaf ( "Leaf XB" ) ) ;
Composite comp2 = new Composite ( "Composite XY" ) ;
comp2. Add ( new Leaf ( "Leaf XYA" ) ) ;
comp2. Add ( new Leaf ( "Leaf XYB" ) ) ;
root. Add ( comp) ;
comp. Add ( comp2) ;
root. Add ( new Leaf ( "Leaf C" ) ) ;
Leaf leaf = new Leaf ( "Leaf D" ) ;
root. Add ( leaf) ;
root. Remove ( leaf) ;
root. DisPlay ( 1 ) ;
Console. ReadKey ( ) ;
}
}
}