码迷,mamicode.com
首页 > 编程语言 > 详细

java中基本的装饰者模式

时间:2014-09-11 18:45:32      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   java   ar   文件   div   问题   

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

 

装饰对象特点:

(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中基本的装饰者模式

标签:style   blog   color   使用   java   ar   文件   div   问题   

原文地址:http://www.cnblogs.com/keeno/p/3966781.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!