Proxy パターン

なおこ(・∀・)さんのサイトではこちら
代理オブジェクトが間に入り、実際のオブジェクトと変わらない動きをすると。間に一つクラスが入ることにより実際のオブジェクトは必要なときだけ使用する、といった実装になるわけですね。
なんだか面白そうなので自分でも書いてみました。


[Visual Basic]


Imports System
Imports System.Collections.Generic



Public Interface IRunking

Function GetMusic(ByVal runk As Integer) As Music

End Interface



Public Class Proxy
Implements IRunking


Private _knownRunking As Dictionary(Of Integer, Music)

Private _olicon As OliconRunking


Public Sub New()

Me._knownRunking = New Dictionary(Of Integer, Music)
Me._olicon = New OliconRunking

End Sub


Public Function GetMusic(ByVal runk As Integer) As Music Implements IRunking.GetMusic

If Me._knownRunking.ContainsKey(runk) Then

Return Me._knownRunking.Item(runk)

Else

Dim realData As Music = Me._olicon.GetMusic(runk)

Me._knownRunking.Add(runk, realData)

Return realData

End If

End Function


End Class



Public Class OliconRunking
Implements IRunking

Private _runking As Dictionary(Of Integer, Music)

Public Sub New()

Me._runking = New Dictionary(Of Integer, Music)

' 2007 年 01 月 14 日 付
Me._runking.Add(1, New Music("千の風になって", "秋川雅史"))
Me._runking.Add(2, New Music("しるし", "Mr.Children"))
Me._runking.Add(3, New Music("宙船(そらふね)/do! do! do!", "TOKIO"))
Me._runking.Add(4, New Music("千の夜をこえて", "Aqua Timz"))
Me._runking.Add(5, New Music("僕らの街で", "KAT-TUN"))
Me._runking.Add(6, New Music("黒い涙", "ANNA TSUCHIYA inspi'NANA(BLACK STONES) "))
Me._runking.Add(7, New Music("Man and Woman", "CHAGE and ASKA"))
Me._runking.Add(8, New Music("関風ファイティング", "関ジャニ∞(エイト)"))
Me._runking.Add(9, New Music("Here & There", "CHAGE and ASKA"))
Me._runking.Add(10, New Music("ぼくはくま", "宇多田ヒカル"))

End Sub


Public Function GetMusic(ByVal runk As Integer) As Music Implements IRunking.GetMusic

If Me._runking.ContainsKey(runk) Then

Return Me._runking.Item(runk)

Else

Return Nothing

End If

End Function


End Class



Public Class Music


Private _title As String

Public ReadOnly Property Title() As String
Get
Return _title
End Get
End Property


Private _artist As String

Public ReadOnly Property Artist() As String
Get
Return _artist
End Get
End Property


Public Sub New(ByVal title As String, ByVal artist As String)

Me._title = title
Me._artist = artist

End Sub


End Class