装饰者模式:增强一个类的功能还可以让装饰者类之间互相装饰。
装饰者模式和继承的区别:继承实现的增强类:
优点:代码结构清晰,而且实现简单 缺点:对于每一个的需要增强的类都要创建具体的子类来帮助其增强,这样会导致继承体系过于庞大。 装饰模式实现的增强类: 优点:内部可以通过多态技术对多个需要增强的类进行增强 缺点:需要内部通过多态技术维护需要增强的类的实例。进而使得代码稍微复杂。
下面来个例子来实现装饰者模式的效果
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 @Override19 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 @Override35 public void study() {36 // TODO Auto-generated method stub37 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 @Override52 public void study() {53 // TODO Auto-generated method stub54 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 }