首页 > 代码库 > java中基本的装饰者模式

java中基本的装饰者模式

感觉装饰者模式挺实用的,它可以在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象,跟名字一样,名副其实的装饰者。

 

装饰对象特点:

(1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的引用(reference)
(3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
 
不多说 直接上代码。
比如说,现在有一群学生,我们要以不同的母语把他们分开来,例如ChineseStu,EnglishStu,JapaneseStu。
 1 //接口 2 interface Student { 3   public void speak(); 4 } 5  6 //中国学生 7  8 class ChineseStu implements Student{ 9   public void speak() {10     System.out.println("你好!");11   }12 }13 14 //英国学生15 16 class EnglishStu implements Student{17   public void speak() {18     System.out.println("Hello!");19   }20 }21 22 //日本学生23 24 class JapaneseStu implements Student{25   public void speak() {26     System.out.println("こんにちは!");27   }28 }

但是现在有了个新的问题,比如我们要在他们打招呼之后说一声他们各自来自于哪个学校,例如Aschool, Bschool怎么办?再写一个子类继承Stu们吗?不需要哦,这个时候就可以用装饰者模式来装饰啦,代码如下。

 1 //装饰者 2 class AschoolStu implements Student { 3   private Student student; 4   AschoolStu(Student student) {  //包含对真实对象的引用 5     this.student = student; 6   } 7   public void speak() {  //有相同的接口 8     student.speak(); 9     System.out.println("Aschool student!"); //附加功能10   }11 }12 13 //Aschool的中国学生打招呼14 class Test {15   public static void main(String args[]) {16     ChineseStu cstu = new ChineseStu();17     AschoolStu acstu = new AschoolStu(cstu);18     acstu.speak();  //"你好!\nAschool student!"19   }20 }

 

 
 

java中基本的装饰者模式