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 }
时间: 2024-10-14 01:01:07

java中基本的装饰者模式的相关文章

JAVA设计模式初探之装饰者模式

定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的. 要点: 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为 实际上Java 的I/O API就是使用Decorator实现的. //定义被装饰

Java IO流以及装饰器模式在其上的运用

流概述 Java中,流是一种有序的字节序列,可以有任意的长度.从应用流向目的地称为输出流,从目的地流向应用称为输入流. Java的流族谱 Java的 java.io 包中囊括了整个流的家族,输出流和输入流的谱系如下所示: InputStream和OutputStream InputStream和OutputStream分别是输入输出流的顶级抽象父类,只定义了一些抽象方法供子类实现. 在输出流OutputStream中,如果你需要向一个输出流写入数据,可以调用 void write(int b)

详解 Java I/O 与装饰者模式

1.I/O分类与装饰者模式 基本java I/O包含两种类型的流,字节流(inputStream.outputStream)与字符流(Writer,Reader),关于I/O操作类的设计,用到了装饰者模式,如下图所示. 其中FilterInputStream抽象类继承了InputStream抽象类,并且组合了InputStream类. public class UpperCaseInputStream extends FilterInputStream { //继承InputStream //组

06JavaIO详解_IO流中的设计模式-装饰者模式

Io流里面的过滤流和节点流用的就是装饰者模式.整个的IO体系就是装饰模式. 这个写法就是装饰者模式.对上面的三个已经存在的类(DataOutputStream,BufferedOutputStream,FileOutputStream)进行组合,具有三种功能. 对于DataOutputStream dos=new DataOutStream(new BufferedOutputStream(new FileOutputStream("data.txt"))); 这行代码来说. OutP

Java文件与io——装饰者模式

意图: 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比于生成子类更为灵活.该模式以对客户端透明的方式扩展对象的功能. 适用环境 在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. 处理那些可以撤销的职责. 当不能采用生成子类的方法进行扩充时.一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使的子类数目呈爆炸性增长.另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类. 涉及角色: 抽象组件:定义一个抽象接口,来规范准备附加功

Symfony2中的设计模式——装饰者模式

装饰者模式的定义 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 装饰者模式把每个要装饰的功能放在单独的类中,并让这个类包装它要装饰的对象,因此,当需要执行特殊行为时,客户端代码就可以在运行的时候根据需要有选择地.按顺序地使用装饰功能包装对象了. 图1 使用场景 设想一下,如果我们需要创建一个在不同场合有不同着装的学生,例如:在学校学生需要穿上校服,在舞会学生需要穿上正装,在家学生可以裸装(有点变态),当然,还可以学习超人把

JAVA设计模式之【装饰者模式】

装饰模式 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用. 在软件设计中,对已有对象(新房)的功能进行扩展(装修). 把通用功能封装在装饰器中,用到的地方进行调用. 装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.引入装饰类,扩充新功能. 角色 抽象构件 具体构件 抽象装饰类 具体装饰类案例一,窗体装饰 1.组件类 package Decorator; // 装饰者模式 /** Created by Jiqing on 2016/10/

JAVA基础——设计模式之装饰者模式

装饰模式 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用. 在软件设计中,对已有对象(新房)的功能进行扩展(装修). 把通用功能封装在装饰器中,用到的地方进行调用. 装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.引入装饰类,扩充新功能. 角色 抽象构件 具体构件 抽象装饰类 具体装饰类 案例一,窗体装饰 1.组件类 package Decorator; // 装饰者模式 /** * Created by Jiqing on 2016/

详解 Java 中的三种代理模式

代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.      这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法.      举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎