|
Dit artikel is gepubliceerd op zondag 31 juli 2011 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 2010 Broncode Namespace Example1 Enum Level Strategy1 Strategy2 Strategy3 End Enum Class Context Private m_Strategy As Level Public Sub New( ByVal strategy As Level) m_Strategy = strategy End Sub Public Sub Action() Select Case m_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 ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 2010 Broncode 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 Public Overrides Sub Action() MyBase.Action() Console.WriteLine( "Advanced Action") End Sub End Class Class Context Private m_Strategy As Strategy Public Sub New( ByVal strategy As Strategy) m_Strategy = strategy End Sub Public Sub Action() m_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 ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 2010 Broncode 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 ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 2010 Broncode Namespace Example2 Partial Class Context Public Sub SetStrategy( ByVal value As Strategy) m_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 ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output Base Action
Other Advanced Action
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|