Command Pattern in VB.NET

 Command pattern encapsulates a request as an object and gives it a known public interface. Command Pattern ensures that every object receives its own commands and provides a decoupling between sender and receiver. A sender is an object that invokes an operation, and a receiver is an object that receives the request and acts on it.

Let us examine this pattern with the help of most commonly used electronic gadgets at home, a VCR, a DVD player and a Universal Remote to start and stop them.

Follow steps mentioned below to create an implementation of Command pattern in VB.NET:

Step 1: Command Interface 

Create a Command interface with Execute method. All the concrete Command objects must provide implementation of Execute method, as it would be called to perform the requested operation.

//File Name : ICommand.vb
Imports System
Public Interface ICommand
Sub Execute()
End Interface 'ICommand

Step 2: Command Objects

Create Command objects implementing Command interface needed for this example. These objects would act as Receivers and execute requested functionality through Execute method. For this example, we will consider four command objects, namely DVDPlayCommand- command to play DVD, DVDStopCommand - command to stop DVD and similarly VCRPlayCommand- command to play VCR and VCRStopCommand- command to stop VCR.

//File Name : DVDPlayCommand.vb
Imports System
Public Class DVDPlayCommand
Implements ICommand 'ToDo: Add Implements Clauses for implementation methods of these interface(s)
Public Sub New
()
End Sub 'New
Public Sub Execute()
Console.WriteLine("DVD Started.")
End Sub 'Execute
End Class 'DVDPlayCommand

//File Name : DVDStopCommand.vb
Imports System
Public Class DVDStopCommand
Implements ICommand 'ToDo: Add Implements Clauses for implementation methods of these interface(s)
Public Sub New
()
End Sub 'New
Public Sub
 Execute()
Console.WriteLine("DVD Stopped.")
End Sub 'Execute
End Class 'DVDStopCommand

//File Name : VCRPlayCommand.vb
Imports System
Public Class VCRPlayCommand
Implements ICommand 'ToDo: Add Implements Clauses for implementation methods of these interface(s)
Public Sub New
()
End Sub 'New
Public Sub
 Execute()
Console.WriteLine("VCR Started.")
End Sub 'Execute
End Class 'VCRPlayCommand

//File Name : VCRStopCommand.vb
Imports System
Public Class VCRStopCommand
Implements ICommand 'ToDo: Add Implements Clauses for implementation methods of these interface(s)
Public Sub New
()
End Sub 'New
Public Sub
 Execute()
Console.WriteLine("VCR Stopped.")
End Sub 'Execute
nd Class 'VCRStopCommand

Step 3: The Invoker or Sender Object.

The invoker or Sender object is the one which invokes the requested functionality. 

Create a Remote object, which would act as an invoker and would invoke operation requested by Client. This object has a method called Invoke, which takes an ICommand object as parameter and invokes its Execute method. 

//File Name : Remote.vb
Imports System
Public Class Remote
Public Sub New()
End Sub 'New
Public Sub Invoke(ByVal cmd As
 ICommand)
Console.WriteLine("Invoking.......")
cmd.Execute()
End Sub 'Invoke
End Class 'Remote

Step 4: And the Client Object.

Create a Client object, which would instantiate a Remote object and all the commands client is interested in and then would pass them to Remote object to invoke those operations.

//File Name : Client.vb
Imports System
_
Public Class Client
Public Sub New()
End Sub 'New
'Entry point which delegates to C-style main Private Function
Public Overloads Shared Sub Main()
System.Environment.ExitCode = Main(System.Environment.GetCommandLineArgs())

End
 Sub
Public
 Overloads Shared Function Main(ByVal args() As [String]) As Integer
'Instantiate the invoker object
Dim remote As New Remote
'Instantiate DVD related commands and pass them to invoker object
Dim dvdPlayCommand As New DVDPlayCommand
remote.Invoke(dvdPlayCommand)
Dim dvdStopCommand As New DVDStopCommand
remote.Invoke(dvdStopCommand)
'Instantiate VCR related commands and pass them to invoker object
Dim vcrPlayCommand As New VCRPlayCommand
remote.Invoke(vcrPlayCommand)
Dim vcrStopCommand As New VCRStopCommand
remote.Invoke(vcrStopCommand)
Return 0
End Function 'Main
End Class 'Client

Step 5

Compile all above programs as 

vbc /recurse:*.vb.

Step 6

Run the program Client.exe to see the output in your console window.

Invoking.......
DVD Started.
Invoking.......
DVD Stopped.
Invoking.......
VCR Started.
Invoking.......
VCR Stopped.

In this example Remote act as an invoker as it invokes DVD or VCR related command request passed to it by the client. Objects beginning with DVD and VCR act as receiver objects and they know how to complete the request. Thus, we can say that Remote(Sender) object does not have any knowledge of the operation, it just invokes the implementation through Execute method. However Receivers know very well how to implement the requested operation (Start or Stop). Hence there is decoupling between Sender(Remote) and Receiver(DVD/VCR). 

Usage 

One of most common use of this pattern is with Menu Items of a GUI application. Different commands can be created to invoke different functionality by clicking on different menu items of the application.

Disclaimer

The above program is intended solely for learning purpose. Author will not be held responsible for any failure or damage caused due to any other usage.