Home  >  Article  >  Java  >  Java Design Patterns Decorator Pattern Detailed Explanation and Code Examples

Java Design Patterns Decorator Pattern Detailed Explanation and Code Examples

高洛峰
高洛峰Original
2017-01-19 15:48:491188browse

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 us assume 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 make another design, so that each personality or hobby becomes a decoration that can be dynamically added to each girl's body.

2. Class diagram structure

Java Design Patterns Decorator Pattern Detailed Explanation and Code Examples

3. Decorator pattern sample code

Girl.java

public abstract class Girl {
 String description = "no particular";
 public String getDescription(){
  return description;
 }
}

AmericanGirl .java

public class AmericanGirl extends Girl {
 public AmericanGirl() {
  description = "+American";
 }
}

EuropeanGirl.java

public class EuropeanGirl extends Girl {
 public EuropeanGirl(){
  description = "+European";
 }
}

GirlDecorator.java

public abstract class GirlDecorator extends Girl {
 public abstract String getDescription();
}

Science.java

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

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

public class Main {
 public static void main(String[] args) {
  //普通美国女孩
  Girl g1 = new AmericanGirl();
  System.out.println(g1.getDescription());
  //喜欢科学的
  Science g2 = new Science(g1);
  System.out.println(g2.getDescription());
  //喜欢艺术的
  Art g3 = new Art(g2);
  System.out.println(g3.getDescription());
 }
}

4. The application of the decorator pattern in JDK

The IO in Java is the most typical example of the use of the decorator pattern.

The following is a simple example of decorating an InputStreamReader object through a BufferedReader object:

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
//System.in is an InputStream object

For more detailed explanations and code examples of the decorator pattern in Java design patterns, please pay attention to the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn