Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

34.3. Strategy Pattern

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

Wanneer het gedrag van een bepaalde actie (Action) afhankelijk is van een bepaalde logica (hier de ingestelde strategie Level), kan men aan de hand van selecties (hier Select Case ... End Select) beslissen welk gedrag wordt uitgevoerd :
Visual Basic 2012 Broncode - Codevoorbeeld 820
Namespace Example1
    Enum Level
        Strategy1
        Strategy2
        Strategy3
    End Enum
    Class Context
        Private _Strategy As Level
        Public Sub New(ByVal strategy As Level)
            _Strategy = strategy
        End Sub
        Public Sub Action()
            Select Case _Strategy
                Case Level.Strategy1
                    Console.WriteLine("Base Action")
                Case Level.Strategy2
                    Console.WriteLine("Other Base Action")
                Case Level.Strategy3
                    Console.WriteLine("Base Action")
                    Console.WriteLine("Advanced Action")
            End Select
            Console.WriteLine()
        End Sub
    End Class
    Class Client
        Public Shared Sub Main()
            Dim context1 As New Context(Level.Strategy1)
            context1.Action()
            '
            Dim context2 As New Context(Level.Strategy2)
            context2.Action()
            '
            Dim context3 As New Context(Level.Strategy3)
            context3.Action()
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
Base Action

Other Base Action

Base Action
Advanced Action
Indien een extra strategie nodig is, moet de enumeratie Level worden aangepast, en moet een Case worden toegevoegd.
Wat een erg statisch manier is om deze intelligentie toe te voegen, met bijhorende nadelen.  Bij een uitgebreid gedrag en vele strategieën wordt  deze aanpak erg moeilijk om te onderhouden.

Een "strategy pattern" kan gebruik worden om conditionele logica met selectiestructuren om te bouwen tot een meer dynamisch geheel, waar dynamisch polymorfisme (inheritance en redefinition) wordt gebruikt om de statische selectiestructuren te vermijden.

Strategy pattern is een gedrags GOF design pattern.
Visual Basic 2012 Broncode - Codevoorbeeld 821
Namespace Example2
    MustInherit Class Strategy
        Public MustOverride Sub Action()
    End Class
    Class Strategy1 : Inherits Strategy
        Public Overrides Sub Action()
            Console.WriteLine("Base Action")
        End Sub
    End Class
    Class Strategy2 : Inherits Strategy
        Public Overrides Sub Action()
            Console.WriteLine("Other Base Action")
        End Sub
    End Class
    Class Strategy3 : Inherits Strategy1                                  ' (1)
        Public Overrides Sub Action()
            MyBase.Action()                                               ' (1)
            Console.WriteLine("Advanced Action")
        End Sub
    End Class
    Class Context
        Private _Strategy As Strategy
        Public Sub New(ByVal strategy As Strategy)
            _Strategy = strategy
        End Sub
        Public Sub Action()
            _Strategy.Action()
            Console.WriteLine()
        End Sub
    End Class
    Class Client1
        Public Shared Sub Main()
            Dim context1 As New Context(New Strategy1)
            context1.Action()
            '
            Dim context2 As New Context(New Strategy2)
            context2.Action()
            '
            Dim context3 As New Context(New Strategy3)
            context3.Action()
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
Base Action

Other Base Action

Base Action
Advanced Action
Het "context" object gebruikt intern een bepaalde "strategie" object, waardoor het gedrag van de actie die de contextobject moet ondernemen simpelweg kan worden gedelegeerd naar het interne strategie object.

Bij het toevoegen van een extra strategie hoeft de method Action niet meer worden gewijzigd.
Het belangrijkste bij het toevoegen van nieuwe strategie is dat hiervoor een klasse wordt gecreëerd die afleid van de basisklasse Strategy.  Deze heeft een abstracte (MustOverride) Action die ervoor zorgt dat concrete afgeleiden verplicht zijn een gedrag te definiëren voor deze actie.

Bemerkt ook (1) hoe eenvoudig het nu is het gedrag van een bepaalde strategie te gaan baseren door een reeds bestaande strategie uit te breiden
Door Strategy3 te laten overerven van Strategy1 kan deze de "Base Action" gebruiken door MyBase.Action() aan te roepen.

Hieronder wordt geïllustreerd hoe een nieuwe strategie kan worden toegevoegd.
Visual Basic 2012 Broncode - Codevoorbeeld 822
Namespace Example2
    Class Strategy4 : Inherits Strategy
        Public Overrides Sub Action()
            Console.WriteLine("Other Advanced Action")
        End Sub
    End Class
    Class Client2
        Public Shared Sub Main()
            Dim context1 As New Context(New Strategy1)
            context1.Action()
            '
            Dim context2 As New Context(New Strategy2)
            context2.Action()
            '
            Dim context3 As New Context(New Strategy3)
            context3.Action()
            '
            Dim context4 As New Context(New Strategy4)
            context4.Action()
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
Base Action

Other Base Action

Base Action
Advanced Action

Other Advanced Action
Een nieuwe strategie Strategy4 werd afgeleid van Strategy.

Bemerk hoe de klasse Context ongewijzigd blijft, terwijl deze toch met een nieuwe strategy kan functioneren.

De strategie kan niet alleen at runtime worden ingesteld (via de constructor) maar zou ook nog eens at runtime kunnen veranderen.
Visual Basic 2012 Broncode - Codevoorbeeld 823
Namespace Example2
    Partial Class Context
        Public Sub SetStrategy(ByVal value As Strategy)
            _Strategy = value
        End Sub
    End Class
    Class Client3
        Public Shared Sub Main()
            Dim context1 As New Context(New Strategy1)
            context1.Action()
            '
            context1.SetStrategy(New Strategy4)
            context1.Action()
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
Base Action

Other Advanced Action

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.