Design patterns – Part 2: Decorator pattern
For those, skilled in Java development, Decorator patterns are nothing new, as they are quite common in Java, i.e. FileInputStream with it’s decorator BufferedInputStream class. The definition says:
The Decorator Pattern attaches additional responsibilities to an object dynamically.
More theoretical background can be found on Wikipedia.
I will base this example on the article Design Patterns – Part 1: Strategy pattern. For those that have not read the article, do so now, as it will make things easier to understand here. To summarize, we had three types of product: e-download, events and software, to which we added behavior.
Now, project manager thought it would be nice if we could sell our software in three different packages: Basic, Advanced and Pro. Each having different price.
Why use decorator pattern?
It can be done in multiple ways. However, using decorator pattern, we assure that no already working code will be altered and thus decrease possibility of inserting bugs into already operational code.
Problem implementation
We already have a class called Software that will represent a concrete component. What we have to do is create decorator and three classes for options. Also we do make a small change in Product class and add getDescription and getPrice methods. Code is below:
Class CProduct ... Function getDescription As String End Function Function getPrice As Double End Function ... End Class Class COptionDecorator As CProduct Function getDescription As String End Function End Class Class COptionBasic As COptionDecorator Private product As CProduct Sub New (product As CProduct) Set Me.product = product End Sub Function getDescription As String getDescription = "Basic option" End Function Function getPrice As Double getPrice = product.getPrice + 100 End Function End Class Class COptionAdvanced As COptionDecorator Private product As CProduct Sub New (product As CProduct) Set Me.product = product End Sub Function getDescription As String getDescription = "Advanced option" End Function Function getPrice As Double getPrice = product.getPrice + 200 End Function End Class Class COptionPro As COptionDecorator Private product As CProduct Sub New (product As CProduct) Set Me.product = product End Sub Function getDescription As String getDescription = "Pro option" End Function Function getPrice As Double getPrice = product.getPrice + 500 End Function End Class
How to use this?
Simple code below, shows you how easy it is to use this set of classes to append different product options to a product.
Sub Initialize Dim swBasic As CProduct Dim swAdvanced As CProduct Dim swPro As CProduct Set swBasic = New CSoftware Set swBasic = New COptionBasic (swBasic) Messagebox swBasic.getDescription & ": " &_ swBasic.getPrice & " EUR" Set swAdvanced = New CSoftware Set swAdvanced = New COptionAdvanced (swAdvanced) Messagebox swAdvanced.getDescription & ": " &_ swAdvanced.getPrice & " EUR" Set swPro = New CSoftware Set swPro = New COptionPro (swPro) Messagebox swPro.getDescription & ": " &_ swPro.getPrice & " EUR" End Sub
This is all there is to decorator pattern. As you can see, it is easy to use and even simpler to implement.
Leave a Reply