首页 > 代码库 > java 装饰者类

java 装饰者类

装饰者模式:增强一个类的功能还可以让装饰者类之间互相装饰。


装饰者模式和继承的区别:

继承实现的增强类:
  优点:代码结构清晰,而且实现简单
  缺点:对于每一个的需要增强的类都要创建具体的子类来帮助其增强,这样会导致继承体系过于庞大。


装饰模式实现的增强类:
  优点:内部可以通过多态技术对多个需要增强的类进行增强
  缺点:需要内部通过多态技术维护需要增强的类的实例。进而使得代码稍微复杂。

 

下面来个例子来实现装饰者模式的效果

 1 //1.创建一个需要继承的父类(或者需要扩展功能的类)
 2 class Person {
 3     public void study() {
 4         System.out.println("学习");
 5     }
 6 }
 7 
 8 //2.装饰者类(子类)
 9 class Student1 extends Person{
10     //2.1子类中维护一个父类(被装饰者类)
11     Person student;
12     //2.2构造方法,里面传一个被装饰者类的对象
13     public Student1(Person student) {
14         this.student = student;
15     }
16     
17     //2.3复写被装饰者类的 需要扩展的方法
18     @Override
19     public void study() {
20         student.study();
21         //2.4对方法进行扩展,添加“读书”这一方法
22         System.out.println("读书");    
23     }
24     
25 }
26 
27 //3.类似前面的对被装饰者方法进行扩展另一个方法
28 class Student2 extends Person{
29     Person student;
30     public Student2(Person student) {
31         this.student  = student ;
32     }
33 
34     @Override
35     public void study() {
36         // TODO Auto-generated method stub
37         student.study();
38         //另一个扩展方法,“写字”
39         System.out.println("写字");
40     }
41 }
42 
43 
44 class Student3 extends Person{
45     Person student;
46     
47     public Student3(Person student) {
48         this.student  = student ;
49     }
50 
51     @Override
52     public void study() {
53         // TODO Auto-generated method stub
54         student.study();
55         //另一个扩展方法,“画画”
56         System.out.println("画画");
57     }
58 }
59 
60 
61 public class readerExt {
62 
63     public static void main(String[] args) {
64         
65         //5.创建被装饰者类的对象
66         Person person = new Person();
67         person.study();  //学习
68         
69         //5.1创建装饰者类(子类)的对象,传入被装饰者类的对象
70         Student1 s1 = new Student1(person);
71         s1.study();  //学习,读书
72         
73         Student2 s2 = new Student2(person);
74         s2.study();  //学习,写字
75         
76         //5.2 装饰者 互相装饰
77         Student3 s3 = new Student3(s2);
78         s3.study();  //学习,读书,画画
79         
80     }    
81 }

 

java 装饰者类