1. Definition
The Decorator Design Pattern dynamically adds or overrides behaviors in an object without changing its structure. It is a structural pattern that involves a set of decorator classes that are used to wrap concrete components. These decorators mirror the type of the components they decorate but add or override behavior.
2. Problem Statement
Imagine you have a simple coffee shop application where various beverages are sold. As new beverages or add-ons (like milk, sugar, whipped cream) are introduced, directly modifying the original classes can become complex and can violate the Open/Closed principle.
3. Solution
The Decorator Pattern allows behaviors to be added to individual objects, either statically or dynamically, without affecting the behavior of other objects from the same class.
4. Real-World Use Cases
1. GUI toolkits where individual graphical components can be decorated with scroll bars, borders, shadows, etc.
2. Java I/O classes, like BufferedInputStream which adds buffering to another InputStream.
5. Implementation Steps
1. Define a component interface.
2. Implement the concrete component which needs to be decorated.
3. Create abstract decorator class referencing the component interface.
4. Implement concrete decorator classes extending the abstract decorator.
6. Implementation
// Step 1: Define the component interface
interface Beverage {
String getDescription();
double cost();
}
// Step 2: Implement concrete components
class Espresso implements Beverage {
public String getDescription() {
return "Espresso";
}
public double cost() {
return 1.99;
}
}
// Step 3: Create abstract decorator class
abstract class BeverageDecorator implements Beverage {
protected Beverage beverage;
}
// Step 4: Implement concrete decorators
class Milk extends BeverageDecorator {
public Milk(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Milk";
}
public double cost() {
return beverage.cost() + 0.30;
}
}
class Sugar extends BeverageDecorator {
public Sugar(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Sugar";
}
public double cost() {
return beverage.cost() + 0.10;
}
}
// Step 5: Demonstrate the Decorator Pattern
public class DecoratorPatternDemo {
public static void main(String[] args) {
Beverage espresso = new Espresso();
System.out.println(espresso.getDescription() + " $" + espresso.cost());
Beverage espressoWithMilk = new Milk(espresso);
System.out.println(espressoWithMilk.getDescription() + " $" + espressoWithMilk.cost());
Beverage espressoWithMilkSugar = new Sugar(espressoWithMilk);
System.out.println(espressoWithMilkSugar.getDescription() + " $" + espressoWithMilkSugar.cost());
}
}
Output:
Espresso $1.99
Espresso, Milk $2.29
Espresso, Milk, Sugar $2.39
Explanation
In this demonstration, a basic espresso beverage is decorated first with milk and then with sugar. The decorators add their respective costs and descriptions to the base price and description of the espresso. The main advantage is the ease of extending or adding new functionalities without altering existing code.
7. When to use?
Use the Decorator Pattern when:
1. You need to add responsibilities to individual objects dynamically and transparently.
2. You want to avoid subclassing because it can result in an exponential explosion of subclasses.
3. You want to keep new functionality separate. For instance, adding enhancements.
Design Pattern
Related Java Source Code Examples:
Java Record Class Example
Java Text Blocks Example
Java Record Builder Pattern Example
Java Record Constructor Example
Java Record Constructor Validation Example
Java Record Serializable Example
Java Record Getter Example
Java Record Default Constructor
Java Records CRUD (Create, Read, Update, Delete) Example
Java Record Custom Methods
Java Record Custom toString
Java Record Custom equals and hashCode
Java Records with Spring Boot CRUD Example
Java Record Implement Interface Example
Java Switch Expressions Example
Java Pattern Matching for instanceof
Java Sealed Class Example
Java Sealed Class vs Final Class
Java Sealed Class Record Example
Java Sealed Class Generic Example
Java Sealed Class Enum Example
Java Sealed Class Switch Example
Java var Keyword Example
Java CompactNumberFormat Class Example
Java Vector API Example
Pattern Matching for Switch Example
Collectors.teeing() in Stream API Example
Java FileSystems.newFileSystem() Method Example
Java Files.readString() and Files.writeString() Example
Java String isBlank Example
Java String strip Example
Java String repeat Example
Java String lines Example
Java String stripIndent Example
Java Binary Search (Recursive and Iterative) Program
Java Happy Birthday Program
Java Program That Calculates the Age of a Person
Java Logical And Or Xor Examples
Java Format Date and Time Examples
Java Convert String to Date and Time
Java Convert Roman to Integer Number
Java Convert Octal to HexaDecimal
Java Convert Octal to Decimal
Java Convert Integer Number to Roman Number
Java Convert Hexadecimal to Binary
Java Convert Decimal to Octal
Java Convert Decimal to Binary
Java Convert Binary to Decimal
Java Convert Binary to an Octal
Java Convert Binary to a Hexadecimal
Java Convert a Unix Timestamp to Date Time
Java Check If Two Integer Arrays are Equals
Java program that removes all white spaces from the given string
Java 8 program that counts the number of vowels and consonants in a given string
Java 8 program that reverses words of a given string
Java Program to Count Number of Digits in an Integer
Java Program Fibonacci Series Using Recursion
Java Program to Find Factorial of a Number
Java program to calculate the area of Triangle
Java Program to Calculate Area of Square
Java Program to Calculate Area of Rectangle
Java Program to find the Smallest of three numbers using Ternary Operator
Java Program to Find Largest of Three Numbers
Java Program to Find GCD of Two Numbers
Java Program to Check Armstrong Number
Java Program to Generate Random Number
Java Program to Check if Number is Positive or Negative
Java program to check prime number
Java Program to Calculate Simple Interest
Java Program to Swap Two Numbers Without using a Temporary Variable
Java Program to Swap Two Numbers
Java Program to Find ASCII Value of a Character
Java Program to Check Whether an Alphabet is Vowel or Consonant
Java Program to Check Leap Year
Java Program to Check Even or Odd Number
Java Program to Add Two Numbers
Java Program to Swap Two Strings Without Using Third Variable
Java Program to Swap Two Strings with Third Variable
How to Get All Digits from String in Java
Find Duplicate Number in Array in Java
How to Get Current Working Directory in Java?
Check Palindrome String in Java
Java Program to Create Pyramid Of Numbers
Create a String object in Java Example
Java String valueOf() Method Example
Java String.trim() Method Example
Java String.toUpperCase() Method Example
Java String toLowerCase() Method Example
Java String toCharArray() Method Example
Java String substring() Method Example
Java String.startsWith() Method Example
Java String split() Method Example
Java String.replaceFirst() Method Example
Java String.replaceAll() Method Example
Java String replace() Method Example
Java String regionMatches() Method Example
Java String length() Method Example
Java String lastIndexOf() Method Example
Java String intern() Method Example
Java String indexOf() Method Example
Java String getChars() Method Example
Java String getBytes() Method Example
Java String equals() and equalsIgnoreCase() Example
Java String.endsWith() Method Example
Java String.contentEquals() Method Example
Java String.contains() Method Example
Java String concat() Method Example
What's the Simplest Way to Print a Java Array?
Merge two String Arrays Example
Checks If a String is Not Empty and Not Null in Java
Reverse a String in Java Using StringBuilder
Capitalize the First Letter of a String in Java Example
Java String codePointAt() Method Example
Java String Compare Using equals() Method
Sort String in Descending Order in Java
Sort String in Ascending Order in Java
How to Get All Digits from String in Java
Java String getDigits() Utility Method
Java String isAlphanumeric() Utility Method
Java String isAlpha() Utility Method
Java String countMatches() Utility Method
Java String mergeStringArrays(String array1[], String array2[]) Utility Method Example
Java String quote( String str) Utility Method
Java arrayToMap(String[][] array) Utility Method
Java String fromBufferedReader() Utility Method - Converts a BufferedReader into a String
Java String isNumericSpace() Utility Method
Java String isNumeric() Utility Method
Java String isAlphanumericSpace() Utility Method
Java String isAlphaSpace(() Utility Method
Java trimArrayElements() Utility Method
Java trimArrayElements() Utility Method
Java String containsWhitespace() Utility Method
Java String isBlank() Utility Method
Java String isAnyEmpty() Utility Method
Java String isNotEmpty() Utility Method
Java String isEmpty() Utility Method
Java String Uppercase First Character Example
Java String uppercaseFirstChar() Utility Method
Java String trimTrailingCharacter() Utility Method
Java String trimLeadingCharacter() Utility Method
Java String trimTrailingWhitespace() Utility Method
Java String trimLeadingWhitespace() Utility Method
Java String trimAllWhitespace() Utility Method
Java String trimWhitespace() Utility Method
Java StringBuilder trimToSize() Method Example
Java StringBuilder substring() Method Example
Java StringBuilder setLength() Method Example
Java StringBuilder reverse() Method Example
Java StringBuilder lastIndexOf() Method Example
Java StringBuilder insert() Method Example
Java StringBuilder indexOf() Method Example
Java StringBuilder getChars() Method Example
Java StringBuilder ensureCapacity() Method Example
Java StringBuilder deleteCharAt() Method Example
Java StringBuilder delete() Method Example
Java StringBuilder codePointBefore() Method Example
Java StringBuilder codePointAt Method Example
Java StringBuilder capacity() Method Example
Java StringBuilder append() Method Example
Java Convert Integer to String Example
Java Convert Float to String Example
Java Convert Double to String Example
Java Convert Short to String Example
Java Convert Long to String Example
Java Convert Character to String Example
Java Convert Byte to String Example
Java Convert Boolean to String Example
Java Convert String To Short Example
Java Convert String To Long Example
Java Convert String To Integer Example
Java Convert String To Float Example
Java Convert String To Double Example
Java Convert String To Byte Example
Java Convert String To Boolean Example
Clear ArrayList in Java Example
Java ArrayList add(), get() and set() Method Example
Iterate over ArrayList Using forEach Java
Iterate over ArrayList using Iterator in Java
Java ArrayList indexOf() and lastIndexOf() Example
Search an Element in an ArrayList in Java
Java ArrayList removeAll() Method Example
Java ArrayList remove() Method Example
How to Iterate over ArrayList in Java
How to Remove Element from ArrayList in Java
How to Access Elements of ArrayList in Java
Create ArrayList from Another ArrayList in Java
How to Create an ArrayList and Add Elements to It
Java ArrayList subList() Example
Get Index of Elements in ArrayList Example
Java ArrayList removeIf() Example
Copying part of Array in Java Example
Sorting an Array using Arrays.sort() Method
Check Two Arrays are Deeply Equal
Java Arrays.copyOf() Example - Copying an Array
Java Arrays.binarySearch() Example - Searching an Array
Java Arrays.asList() Example - Convert Array to ArrayList
Sort String in Ascending Order in Java
Sort String in Descending Order in Java
Sort Integer in Ascending Order in Java Example
Sort Integer in Descending Order in Java Example
Sort User-Defined Objects in Ascending Order in Java
Sort User-Defined Objects in Descending Order in Java
Sort User-Defined Objects using Comparator Interface
Java LinkedList add(), addFirst(), addLast() and addAll() Example
Iterate LinkedList using forEach() Method Example
Iterate through a LinkedList using an Iterator in Java
Iterate or Loop Through Elements LinkedList in Java Example
Search Elements of LinkedList in Java with Example
Remove First and Last Elements of LinkedList in Java
Get Elements from LinkedList Java Example
Java LinkedList remove(), removeFirst(), removeLast(), removeIf() and clear() Example
Create HashSet in Java
Iterating over a HashSet using Iterator
Iterate over HashSet in Java
Remove Element from HashSet in Java
Create HashSet in Java
Iterating over a LinkedHashSet using forEach() Method Example
Iterate over LinkedHashSet using Iterator in Java Example
Iterate over LinkedHashSet in Java Example
Remove all Elements from LinkedHashSet in Java Example
Remove Element from LinkedHashSet Example
Check If an Element Exists in Java LinkedHashSet Example
Create LinkedHashSet in Java Example
Create TreeSet in Java Example
Iterating over a TreeSet using Java 8 forEach() Method
Iterate over a TreeSet using Iterator in Java Example
Iterate over TreeSet in Java Example
Remove All Elements from Java TreeSet Example
Remove First and Last Element from TreeSet in Java
Remove Element from TreeSet in Java Example
Check If an Element Exists in Java TreeSet Example
Java TreeSet add(), first() and last() Method Example
Java Convert ArrayList to Stack Example
Java Convert Array to Stack Example
Java Stack push() Method Example
Java Stack empty() Method Example
Java Stack peek() Method Example
Java Stack search() Method Example
Java Stack pop() Method Example
Java Deque and ArrayDeque Examples
Iterating over a Queue in Java Example
Java Queue isEmpty(), size(), element() and peek() Example
Java Queue Interface Example
Java Priority Queue of User Defined Objects Example
Java Create a Priority Queue with a Custom Comparator
Create a Priority Queue in Java Example
HashMap Stream and Filtering Example
Java HashMap Iteration over Values Example
Java HashMap Iteration over Keys
Java HashMap replace() Example
Java HashMap size Example
Iterate over a HashMap Java using Lambda
Iterate over a HashMap Java 8 forEach
Iterating over a HashMap using Iterator in Java
Iterate over HashMap in Java
How to Store Employee Objects in HashMap
Remove Entry from HashMap Java
Check If Value Exists in HashMap Java Example
Check If Key Exists in HashMap Java Example
Create a HashMap in Java Example
How to Delete Data from MySQL Table using Java
How to Insert Data in MySQL Table using Java
How to Create Database Table in Java
JDBC DriverManager Example
JDBC PreparedStatement Example
JDBC Statement Example
Java MySQL DataSource Example
Update Query in MySQL using Java PreparedStatement
Login Example with JSP + Servlet + JDBC + MySQL Database
JSP + JDBC + MySQL Example Tutorial
JSP Form Example with JDBC and MySQL Database
Java JDBC CRUD Example - SQL Insert, Select, Update, and Delete Examples
Java Swing JDBC MySQL Database Example
Java JDBC Connection to HSQLDB Database
JDBC Connection to H2 Database Example
JDBC Connection to PostgreSQL Example
JDBC Connection to Oracle Database Example
JDBC Transaction Management Example
JDBC Delete Query Example
JDBC Select Query Example
JDBC Update Query Example
JDBC Insert Multiple Rows Example
JDBC Create a Table Example
What are different types of JDBC Drivers
Advantages of Hibernate Framework over JDBC
Java PostgreSQL Example
Java H2 Insert Record Example
Java H2 Embedded Database Example
Java H2 Create Table Example
Java Simple Lambda Expression Example
Java Lambda Expressions Multiple Statements
Java Lambda Expressions forEach Example
Java Lambda Expression with Multiple Parameters Example
Java Lambda Expression Runnable Example
Java Lambda Expression Comparator Example
Refactoring Factory Design Pattern with Lambdas
Refactoring Chain of Responsibility Pattern with Lambdas
Refactoring Observer Design Pattern with Lambdas
Refactoring Strategy Design Pattern with Lambdas
Iterate HashMap with forEach() + Lambda Expression Example
Iterate HashSet with forEach() + Lambda Expression Example
Iterate ArrayList with forEach() + Lambda Expression Example
Java method reference to a constructor example
Java method reference to static method example
Java method reference to an instance method of an object example
Java method reference to an instance method of an arbitrary object of a particular type
Java 8 - Create Stream Object from Arrays Example
Java 8 Creating a Stream from an Array
Java 8 - Create Stream Object from Collection, List, Set
Java 8 Stream - Sort List of String objects in Descending Order Example
Java 8 Stream - Sort List of String objects in Ascending Order Example
How to convert a Java 8 Stream to an Array?
Java 8 Stream - allMatch(),anyMatch() and noneMatch() Example
Java 8 Stream - Sort List of Objects by Multiple Fields
Java 8 Stream - Sort List of Custom Objects in Ascending and Descending Order
Java 8 - Stream filter(), forEach(), collect() and Collectors.toList() Example
Java Stream filter null values example
Java Stream filter map by values example
Java Stream filter map by keys example
Java 8 Collectors.counting() Example
Java 8 Collectors.averagingDouble() Example
Java 8 Collectors.toSet() Example
Java 8 Collectors.toList() Example
Java 8 Collectors.joining() example
Java 8 Stream multiple filter operations
Java 8 Stream filter map by keys
Java 8 Stream filter map by values
Java 8 Stream collect to list example
Java 8 Stream Collectors.counting() exmaple
Java 8 Collectors.collectingAndThen() example
Java 8 Collectors.toList() Example
Java 8 Collectors.minBy() and Collectors.maxBy() example
Java Stream filter() Example
Java Stream map() Example
Java Stream flatMap() Example
Java Stream distinct() Example
Java Stream limit() Example
Java Stream peek() Example
Java Stream anyMatch() Example
Java Stream allMatch() Example
Java Stream noneMatch() Example
Java Stream collect() Example
Java Stream count() Example
Java Stream findAny() Example
Java Stream findFirst() Example
Java Stream forEach() Example
Java Stream min() Example
Java Stream max() Example
Java Stream reduce() Example
Java Stream toArray() Example
Java Function Functional Interface Example
Java Supplier Functional Interface Example
Java Consumer Example
Java BiConsumer Example
Java BiFunction Example
Java Predicate Example
Java 8 LongConsumer Example
Java 8 IntConsumer Example
Java 8 DoubleConsumer Example
Java StringJoiner Example
Create Optional Class Object in Java - empty(), of(), ofNullable() Methods
Optional get() Method - Get Value from Optional Object in Java
Optional isPresent() Method Example
Optional orElse() Method Example
Optional orElseGet() Method Example
Optional orElseThrow() Method Example
Optional filter() and map() Method Examples
Java 8 program that counts the number of vowels and consonants in a given string
Java 8 program that reverses words of a given string
Java 8 - Copy List into Another List Example
Check Whether the Given Year is Leap Year or Not in Java
Java 8 forEach() Array Example
Java 8 forEach() Map Example
Java 8 forEach() Set Example
Java 8 forEach() List Example
Getting current date and time with Clock
Convert LocalDate to Date in Java
Convert LocalDateTime into Date in Java
Connvert java.util.Date to java.time.LocalDateTime Example
Convert java.util.Date to java.time.LocalDate Example
Duration Between Two LocalDate in Java
Java Convert ZonedDateTime to String Example
Convert String to ZonedDateTime in Java
Compare ZonedDateTime Objects in Java
How to Get Hour, Minute, Second from ZonedDateTime in Java
Convert ZonedDateTime to LocalTime Example
Convert ZonedDateTime to LocalDateTime in Java
Java ZonedDateTime now() and of() Method Example
Convert LocalDateTime to LocalTime in Java
Convert LocalDateTime to LocalDate in Java
Compare LocalDateTime Objects in Java
Java LocalDateTime - Get Hour, Minute and Second
How to Get Day Month and Year from LocalDateTime in Java
Java LocalDateTime now() Method Example
How to Get Current Date Time in Java
Convert LocalDate to String in Java
Convert String to LocalDate in Java
Java LocalDate isLeapYear() Method Example
How to Get Number of Days from Month and Year using LocalDate in Java
Compare Java LocalDate Objects Example
How to Add Days Weeks Months and Years to LocalDate in Java
How to get Day Month and Year from LocalDate in Java
Java LocalDate now() Method Example - Get Current Date and Specific Date
Convert LocalTime to String in Java
Convert String to LocalTime in Java
Java LocalTime isBefore() and isAfter() Method Example
How to Compare Time in Java
Java 8 - LocalTime getHour(), getMinute(), getSecond() and getNano() Example
Java LocalTime now() Method Example - Get Current Time and Specific Time
Java 8 Get Local Date Time in All Available Time Zones
How to get year, month, day, hours, minutes, seconds and milliseconds of LocalDateTime in Java 8?
How to get year, month, day, hours, minutes, seconds and milliseconds of Date in Java?
Difference between Two Dates in Java
Create LocalDateTime from LocalDate and LocalTime in Java
Java
Structural Patterns
Comments
Post a Comment