The decorator pattern can dynamically add capabilities to existing objects. Below, I will use a simple example to demonstrate how to use the decorator pattern in a program.
1. Decorator pattern
Let's assume for a moment that you are looking for a girlfriend. There are many girls from different countries, such as the United States, China, Japan, France, etc. Each of them has different personalities and interests. If you need to simulate such a situation in the program, assume that each girl is For a Java class, there will be thousands of classes, which will cause the expansion of classes, and the scalability of such a design will be relatively poor. Because if we need a new girl, we need to create a new Java class, which actually violates the OCP (open for extension, closed for modification) principle that needs to be followed in program development.
Let's create another design where each personality or hobby becomes a decoration that can be dynamically added to each girl's body.
2. Class diagram structure
3. Decorator pattern sample code
Girl.java
Copy the code code as follows:
public abstract class Girl {
String description = "no particular";
public String getDescription(){
return description;
}
}
AmericanGirl.java
Copy the code code as follows:
public class AmericanGirl extends Girl {
publicAmericanGirl() {
description = "+American";
}
}
EuropeanGirl.java
Copy the code code as follows:
public class EuropeanGirl extends Girl {
public EuropeanGirl(){
description = "+European";
}
}
GirlDecorator.java
Copy the code code as follows:
public abstract class GirlDecorator extends Girl {
public abstract String getDescription();
}
Science.java
Copy the code code as follows:
public class Science extends GirlDecorator {
private Girl girl;
public Science(Girl girl){
this.girl = girl;
}
@Override
public String getDescription() {
return this.girl.getDescription() + "+Like Science";
}
public void caltulateStuff() {
System.out.println("scientific calculation!");
}
}
Art.java
Copy the code code as follows:
public class Art extends GirlDecorator {
private Girl girl;
public Art(Girl girl){
this.girl = girl;
}
@Override
public String getDescription() {
return this.girl.getDescription() + "+Like Art";
}
public void draw() {
System.out.println("draw pictures!");
}
}
Main.java
Copy the code code as follows:
public class Main {
public static void main(String[] args) {
//Ordinary American girl
Girl g1 = new AmericanGirl();
System.out.println(g1.getDescription());
//Those who like science
Science g2 = new Science(g1);
System.out.println(g2.getDescription());
//Those who like art
Art g3 = new Art(g2);
System.out.println(g3.getDescription());
}
}
4. Application of decorator pattern in JDK
IO in Java is the most typical example of using the decorator pattern.
The following is a simple example of decorating an InputStreamReader object through a BufferedReader object:
Copy the code code as follows:
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
//System.in is an InputStream object
(Full text ends)