GA4

Saturday, September 13, 2014

Commonly used Software Design Patterns


Visitor


Let’s take an example of an application which manages Router in different environments. Router should be able to send and receive data from other nodes. Application should have provision to configure routers in different environment. Also, there should be a flexibility of configuring router for new environments without major changes in the source code.




We have different Routers which are configured for Windows and Linux. Now if we want to configure the router for Apple then we just need to create an AppleConfigurator class and inherit the IRouterVisitor to make the router accessible for Apple environment.


Chain of responsibility


This patterns deals with the request coming from an event and it passes to different handlers till the appropriate handler process the request. The simplest example I can take is of vending machine where we insert the coin and machine checks the coin till it is appropriately placed to its proper container.


Let’s say a user inserted one dollar to the vending machine. The handler checks for each handler to validate the coin. FiveCentHandler checks the coin and it did not match the value and it passes back to the handler and then again handler will look for DimeHandler, and then One Quarter handler till it reaches the correct handler i.e. One Dollar Handler to process the coin.


Active Record


Active Record pattern in general used in the data driven application. Each table row is modeled by an instance of a class. The class property will map to the column of table or database object.

This type of pattern is used by ORM like EntityFramework, Genomes etc.

Let say we have Employee class which is a table in database. In this class there are properties like EmployeeID, EmployeeName, EmployeeSalary which correspond to the columns in the database Emplyee table. And not the least there are some methods which will perform some Action on the database table.


Strategy


Strategy pattern allow the function to choose the algorithm at the runtime. They are encapsulated to each other making them interchangeable at any time.

Let us take an example of Navigation device, where the driver is driving a car and want to reach his destination. From a start point there are multiple routes and in case the driver takes a different direction or wrong direction Navigation device has to adjust to choose the best possible route for a driver.


Singleton


We use the singleton patter to create an object which has got only one instance and provide global point of access to it.

Let take an example where we want to use the configuration for logging which is used by all the clients.



Command


When we want to encapsulate a request as an object and then we use this object later to call a method. This may contain different request.

Let’s take an example of multiple button place on a single page. Each button performs different action like save, delete, and update. Now, after clicking on Update client wants to retrieve the old values then he has to UNDO the stuff and if he wants to move to the last updated values then he has to REDO it. For single UNDO and REDO, the task seems to be easy but what happen when the user has done multiple updates and want to REDO – UNDO multiple times to reach or verify the values which has got updated. The same scenario may come for other operations also.

To achieve above, we will be wrapping each command into an object and add the object to a list when a command is executed. When the user want to do the UNDO-REDO, we will scroll the list which we are maintain. This object may contain log information which can be used for the results.

Below is a typical design for command pattern. And let see how the above example fits in below UML.

 
Client is my Application where we have buttons. My Application will create an instance of “ConcreteCommand” which is a request made of Receiver. Here we can say the client has clicked on “Update” Button. This “ConcreteCommand” object will be initiated by Application i.e Client. This “ConcreteCommand’ object is passed to an Invoker through a buton_click event. In the button click event, we call the Execute() method from Command Class. This Execute() method will create the list of events and log the data. Now, if UNDO needs to be done then the previous data is retrieved and adding a pointer to one item up.

No comments: