合成模式中有可能存在二个对象,Composite对象和Leaf对象,Composite对象中能包含Composite对象和Leaf对象,但是Leaf却只能独立存在。在运用合成模式进行建模时候,必须要掌握两个思想,一,在设计对象组的时候,既应该可以包容单个的基本对象,也可以包容其它的对象组。二、单个的基本对象和对象组都应该定义公共的行为,并将这个对象组描述为包容了这个类型的对象的集合。
![](https://www.cnblogs.com/images/cnblogs_com/zhenyulu/Pic59.gif)
在合成模式的原型图中,涉及到三个角色:
1、抽象构件(Component),这是给出的一个公共接口,规定了参与组合的对象的默认行为。
2、合成构件(Composite),参加组合的有子对象的对象,并给出了合成构件的行为。
3、基本构件(Leaf),参加组合的没有子对象的对象。
合成模式根据所实现的接口的不同。分为了安全模式和透明模式,
安全模式是指在Composite构件中实现管理子类对象的方法,如Add,Remove,GetChild等方法,这样在Leaf中就无法实现这些方法,即使有实现也不能通过编译,这样就达到了代码的安全。不够透明,Composite和Leaf对象使用不同的接口
![](https://www.cnblogs.com/images/cnblogs_com/zhenyulu/Pic60.gif)
透明模式,是指在接口中给出所有管理子类的方法,在Composite和Leaf中都能实现这些方法,但是如果在Leaf类中不正确的实现了这些方法,将不能在编译中被检查出来,而在运行时报错。
![](https://www.cnblogs.com/images/cnblogs_com/zhenyulu/Pic61.gif)
以上全部是借的吕老师的代码,下面的就是我自己写的了。两点了,也来不及测试了。明天再看看。
![](https://www.cnblogs.com/images/cnblogs_com/zhenyulu/Pic59.gif)
在合成模式的原型图中,涉及到三个角色:
1、抽象构件(Component),这是给出的一个公共接口,规定了参与组合的对象的默认行为。
2、合成构件(Composite),参加组合的有子对象的对象,并给出了合成构件的行为。
3、基本构件(Leaf),参加组合的没有子对象的对象。
合成模式根据所实现的接口的不同。分为了安全模式和透明模式,
安全模式是指在Composite构件中实现管理子类对象的方法,如Add,Remove,GetChild等方法,这样在Leaf中就无法实现这些方法,即使有实现也不能通过编译,这样就达到了代码的安全。不够透明,Composite和Leaf对象使用不同的接口
![](https://www.cnblogs.com/images/cnblogs_com/zhenyulu/Pic60.gif)
1
using System;
2
using System.Text;
3
using System.Collections;
4![](/Images/OutliningIndicators/None.gif)
5
// "Component"
6
abstract class Component
7
{
8
// Fields
9
protected string name;
10![](/Images/OutliningIndicators/InBlock.gif)
11
// Constructors
12
public Component( string name )
13
{
14
this.name = name;
15
}
16![](/Images/OutliningIndicators/InBlock.gif)
17
// Operation
18
public abstract void Display( int depth );
19
}
20![](/Images/OutliningIndicators/None.gif)
21
// "Composite"
22
class Composite : Component
23
{
24
// Fields
25
private ArrayList children = new ArrayList();
26![](/Images/OutliningIndicators/InBlock.gif)
27
// Constructors
28
public Composite( string name ) : base( name ) {}
29![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
43
// Display each of the node's children
44
foreach( Component component in children )
45
component.Display( depth + 2 );
46
}
47
}
48![](/Images/OutliningIndicators/None.gif)
49
// "Leaf"
50
class Leaf : Component
51
{
52
// Constructors
53
public Leaf( string name ) : base( name ) {}
54![](/Images/OutliningIndicators/InBlock.gif)
55
// Methods
56
public override void Display( int depth )
57
{
58
Console.WriteLine( new String( '-', depth ) + name );
59
}
60
}
61![](/Images/OutliningIndicators/None.gif)
62
/**//// <summary>
63
/// Client test
64
/// </summary>
65
public 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![](/Images/OutliningIndicators/InBlock.gif)
75
comp.Add( new Leaf( "Leaf XA" ) );
76
comp.Add( new Leaf( "Leaf XB" ) );
77
root.Add( comp );
78![](/Images/OutliningIndicators/InBlock.gif)
79
root.Add( new Leaf( "Leaf C" ));
80![](/Images/OutliningIndicators/InBlock.gif)
81
// Add and remove a leaf
82
Leaf l = new Leaf( "Leaf D" );
83
root.Add( l );
84
root.Remove( l );
85![](/Images/OutliningIndicators/InBlock.gif)
86
// Recursively display nodes
87
root.Display( 1 );
88
}
89
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
47
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
48
![](/Images/OutliningIndicators/None.gif)
49
![](/Images/OutliningIndicators/None.gif)
50
![](/Images/OutliningIndicators/None.gif)
51
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
60
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
61
![](/Images/OutliningIndicators/None.gif)
62
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
65
![](/Images/OutliningIndicators/None.gif)
66
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/InBlock.gif)
83
![](/Images/OutliningIndicators/InBlock.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/InBlock.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/InBlock.gif)
88
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
89
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
透明模式,是指在接口中给出所有管理子类的方法,在Composite和Leaf中都能实现这些方法,但是如果在Leaf类中不正确的实现了这些方法,将不能在编译中被检查出来,而在运行时报错。
![](https://www.cnblogs.com/images/cnblogs_com/zhenyulu/Pic61.gif)
1
using System;
2
using System.Text;
3
using System.Collections;
4![](/Images/OutliningIndicators/None.gif)
5
// "Component"
6
abstract class Component
7
{
8
// Fields
9
protected string name;
10![](/Images/OutliningIndicators/InBlock.gif)
11
// Constructors
12
public Component( string name )
13
{ this.name = name; }
14![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/None.gif)
21
// "Composite"
22
class Composite : Component
23
{
24
// Fields
25
private ArrayList children = new ArrayList();
26![](/Images/OutliningIndicators/InBlock.gif)
27
// Constructors
28
public Composite( string name ) : base( name ) {}
29![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
41
// Display each of the node's children
42
foreach( Component component in children )
43
component.Display( depth + 2 );
44
}
45
}
46![](/Images/OutliningIndicators/None.gif)
47
// "Leaf"
48
class Leaf : Component
49
{
50
// Constructors
51
public Leaf( string name ) : base( name ) {}
52![](/Images/OutliningIndicators/InBlock.gif)
53
// Methods
54
public override void Add( Component c )
55
{ Console.WriteLine("Cannot add to a leaf"); }
56![](/Images/OutliningIndicators/InBlock.gif)
57
public override void Remove( Component c )
58
{ Console.WriteLine("Cannot remove from a leaf"); }
59![](/Images/OutliningIndicators/InBlock.gif)
60
public override void Display( int depth )
61
{ Console.WriteLine( new String( '-', depth ) + name ); }
62
}
63![](/Images/OutliningIndicators/None.gif)
64
/**//// <summary>
65
/// Client test
66
/// </summary>
67
public 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![](/Images/OutliningIndicators/InBlock.gif)
77
comp.Add( new Leaf( "Leaf XA" ) );
78
comp.Add( new Leaf( "Leaf XB" ) );
79
root.Add( comp );
80![](/Images/OutliningIndicators/InBlock.gif)
81
root.Add( new Leaf( "Leaf C" ));
82![](/Images/OutliningIndicators/InBlock.gif)
83
// Add and remove a leaf
84
Leaf l = new Leaf( "Leaf D" );
85
root.Add( l );
86
root.Remove( l );
87![](/Images/OutliningIndicators/InBlock.gif)
88
// Recursively display nodes
89
root.Display( 1 );
90
}
91
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
45
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
46
![](/Images/OutliningIndicators/None.gif)
47
![](/Images/OutliningIndicators/None.gif)
48
![](/Images/OutliningIndicators/None.gif)
49
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
62
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
63
![](/Images/OutliningIndicators/None.gif)
64
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
67
![](/Images/OutliningIndicators/None.gif)
68
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/InBlock.gif)
83
![](/Images/OutliningIndicators/InBlock.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/InBlock.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/InBlock.gif)
88
![](/Images/OutliningIndicators/InBlock.gif)
89
![](/Images/OutliningIndicators/InBlock.gif)
90
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
91
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
以上全部是借的吕老师的代码,下面的就是我自己写的了。两点了,也来不及测试了。明天再看看。
1
using System;
2
using Systme.Collection;
3![](/Images/OutliningIndicators/None.gif)
4
abstract class Component
5
{
6
abstract public void AddMatchine
7
abstract public int GetMatchineCount();
8
}
9![](/Images/OutliningIndicators/None.gif)
10
class 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![](/Images/OutliningIndicators/None.gif)
27
class MatchineComponent:Component
28
{
29
public override int GetMatchineCount()
30
{
31
return 1;
32
}
33
}
34![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
24
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
25
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
26
![](/Images/OutliningIndicators/None.gif)
27
![](/Images/OutliningIndicators/None.gif)
28
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
33
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
34
![](/Images/OutliningIndicators/None.gif)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步