1.Compent类
'组合中的对象声明接口,实现所有类的共有接口的默认行为。声明一个接口用于访问和管理Component的子部件
Public MustInherit Class Component
Protected name As String
Public Sub New(ByVal n As String)
Me.name = n
End Sub
Public MustOverride Sub Add(ByVal c As Component)
Public MustOverride Sub Remove(ByVal c As Component)
Public MustOverride Sub Display(ByVal depth As Integer)
End Class
2.Leaf类
'组合中表示叶节点对象,叶节点没有子节点
Public Class Leaf
Inherits Component
Public Sub New(ByVal n As String)
MyBase.New(n)
End Sub
Public Overrides Sub Add(ByVal c As Component)
Console.WriteLine("Cannot add to a leaf")
End Sub
Public Overrides Sub Display(ByVal depth As Integer)
Console.WriteLine(New String("-", depth) & name)
End Sub
Public Overrides Sub Remove(ByVal c As Component)
Console.WriteLine("Connot remove from a leaf")
End Sub
End Class
3.composite类
'定义有枝节点的行为,用来存储子部件,在Component接口中实现与子部件有关的操作
Public Class Composite
Inherits Component
Private _children As New List(Of Component)
Public Property children As List(Of Component)
Get
Return _children
End Get
Set(ByVal value As List(Of Component))
_children = value
End Set
End Property
Public Sub New(ByVal n As String)
MyBase.New(n)
End Sub
Public Overrides Sub Add(ByVal c As Component)
children.Add(c)
End Sub
Public Overrides Sub Display(ByVal depth As Integer)
Console.WriteLine(New String("-", depth) & name)
For Each com In children
com.Display(depth + 2)
Next
End Sub
Public Overrides Sub Remove(ByVal c As Component)
children.Remove(c)
End Sub
End Class
4.客户端
Module Module1
Sub Main()
'生成树根root,根上长出两叶LeafA,leafB
Dim root As Composite = New Composite("root")
root.Add(New Leaf("leafA"))
root.Add(New Leaf("leafB"))
Dim comp1 As Composite = New Composite("Composite X")
comp1.Add(New Leaf("Leaf XA"))
comp1.Add(New Leaf("Leaf XB"))
root.Add(comp1)
Dim comp2 As Composite = New Composite("Composite XY")
comp2.Add(New Leaf("leaf XYA"))
comp2.Add(New Leaf("leaf XYB"))
comp1.Add(comp2)
root.Add(New Leaf("Leaf C"))
Dim myleaf As New Leaf("leaf D")
root.Add(myleaf)
root.Display(1)
Console.WriteLine("删除最后一个节点---------------------------------")
root.Remove(myleaf)
root.Display(1)
Console.Read()
End Sub
End Module