首页编程java编程java装饰模式注意什么意思?java的装饰者模式中装饰类为什么不直接实现接口

java装饰模式注意什么意思?java的装饰者模式中装饰类为什么不直接实现接口

编程之家2023-10-11110次浏览

大家好,关于java装饰模式注意什么意思很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于java的装饰者模式中装饰类为什么不直接实现接口的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

java装饰模式注意什么意思?java的装饰者模式中装饰类为什么不直接实现接口

java的装饰者模式中装饰类为什么不直接实现接口

装饰模式使用被装饰类的一个子类的实例,把客户端的调用委派到被装饰类,装饰模式的关键在于这种扩展是完全透明的。

装饰模式在Java种使用也很广泛,比如我们在重新定义按钮、对话框等时候,实际上已经在使用装饰模式了。装饰模式最浅显的例子是相片-相框的例子。

一、原理图

java装饰模式注意什么意思?java的装饰者模式中装饰类为什么不直接实现接口

其中类的职责如下:

抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象

具体构件角色(Employe):定义一个将要接收附加责任的类

java装饰模式注意什么意思?java的装饰者模式中装饰类为什么不直接实现接口

装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口

具体装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任

二、下面通过一个软件项目例子来说明装饰模式的使用

过程是这样的:

项目经理接到一个项目,项目最终要完成编码。

项目经理接到项目后,先做些前期的工作(比如需求分析、设计),然后将编码工作委派给代码工人,代码工人干完后,项目经理做项目的收尾工作。

实现代码如下:

/**

* Created by IntelliJ IDEA.

* User: leizhimin

* Date: 2008-8-3 12:51:06

*项目

*/

publicinterfaceProject{

/**

*写代码

*/

voiddoCoding();

}

/**

* Created by IntelliJ IDEA.

* User: leizhimin

* Date: 2008-8-3 12:52:12

*代码工人

*/

publicclassEmployeimplementsProject{

/**

*编码

*/

publicvoiddoCoding(){

System.out.println("代码工人在编写代码,加班编啊编啊,终于编完了!");

}

}

/**

* Created by IntelliJ IDEA.

* User: leizhimin

* Date: 2008-8-3 12:51:26

*项目经理

*/

publicclassManagerimplementsProject{

privateProject project;//实际上存放的是代码工人对象

publicManager(Project project){

this.project= project;

}

/**

*编码

*/

publicvoiddoCoding(){

//项目经理开始新的工作

startNewWork();

}

/**

*模板:定义项目经理自己的事情

*/

publicvoidstartNewWork(){

//项目经理在做早期工作

doEarlyWork();

//项目经理很牛,做完需求和设计后,直接将编码委派给代码工人干

project.doCoding();

//项目经理在做收尾工作

doEndWork();

}

/**

*项目经理自己的事情:做早期工作

*/

publicvoiddoEarlyWork(){

}

/**

*项目经理做收尾工作

*/

publicvoiddoEndWork(){

}

}

/**

* Created by IntelliJ IDEA.

* User: leizhimin

* Date: 2008-8-3 13:45:18

*具体的项目经理A

*/

publicclassManagerAextendsManager{

publicManagerA(Project project){

super(project);

}

/**

*项目经理自己的事情:做早期工作

*/

publicvoiddoEarlyWork(){

System.out.println("项目经理A在做需求分析");

System.out.println("项目经理A在做架构设计");

System.out.println("项目经理A在做详细设计");

}

}

/**

* Created by IntelliJ IDEA.

* User: leizhimin

* Date: 2008-8-3 13:45:27

*具体的项目经理B

*/

publicclassManagerBextendsManager{

publicManagerB(Project project){

super(project);

}

/**

*项目经理自己的事情:做早期工作

*/

publicvoiddoEarlyWork(){

System.out.println("项目经理B在做需求分析");

System.out.println("项目经理B在做详细设计");

}

/**

*项目经理做收尾工作

*/

publicvoiddoEndWork(){

System.out.println("项目经理B在做收尾工作");

}

}

/**

* Created by IntelliJ IDEA.

* User: leizhimin

* Date: 2008-8-3 13:03:22

*客户端测试

*/

publicclassClient{

publicstaticvoidmain(String args[]){

Project employe=newEmploye();//代码工人

Project managerA=newManagerA(employe);//项目经理

Project managerB=newManagerB(employe);//项目经理

//以经理的名义将编码完成,功劳都是经理的,实际编码的是工人

managerA.doCoding();

managerB.doCoding();

}

}

运行结果:

项目经理A在做需求分析

项目经理A在做架构设计

项目经理A在做详细设计

代码工人在编写代码,加班编啊编啊,终于编完了!

项目经理B在做需求分析

项目经理B在做详细设计

代码工人在编写代码,加班编啊编啊,终于编完了!

项目经理B在做收尾工作

Java程序性能优化-装饰者模式(4)

装饰者模式()

系统的核心类它实现了向文件写入数据使用DataOutputStream可以在FileOutputStream的基础上增加对多种数据类型的写操作支持而BufferedOutputStream装饰器可以对FileOutputStream增加缓冲功能优化I/O的性能以BufferedOutputStream为代表的性能组件是将性能模块和功能模块分离的一种典型实现

public static void main(String[] args) throws IOException{

//生成一个有缓冲功能的流对象

DataOutputStream dout=

new DataOutputStream(new BufferedOutputStream(new FileOutputStream

( C:\\a txt)))

//没有缓冲功能的流对象

//DataOutputStream dout=new DataOutputStream(new FileOutputStream

( C:\\a txt))

long begin=System currentTimeMillis()

for(int i=;i<;i++)

dout writeLong(i)

System out println( spend:+(System currentTimeMillis() begin))

}

以上代码显示FileOutputStream的典型应用加粗部分是两种建立OutputStream的方法第一种加入了性能组件BufferedOutputStream第二种则没有因此第一种方法产生的OutputStream拥有更好的I/O性能

注意 JDK中OutputStream和InputStream类族的实现是装饰者模式的典型应用通过嵌套的方式不断地将对象聚合起来最终形成一个超级对象并使之拥有所有相关子对象的功能

下面来看一下装饰者模式如何通过性能组件增强I/O性能在运行时工作流程如图所示

图装饰者模式的工作流程

在FileOutputStream write()的调用之前会首先调用BufferedOutputStream write()它的实现如下

public synchronized void write(byte b[] int off int len) throws IOException{

if(len>= buf length){//如果要写入的数据数量大于缓存容量

flushBuffer()//写入所有缓存

out write(b off len)//直接将数据写入文件

return;

}

if(len> buf length count){

flushBuffer()

}

System arraycopy(b off buf count len)

//如果写入的数据比较少则写入缓存

count+= len;

}

private void flushBuffer() throws IOException{

if(count>){

out write(buf count)//这里的out对象就是FileOutputStream

count=;

}

}

可以看到并不是每次BufferedOutputStream write()调用都会去磁盘写入数据而是将数据写入缓存中当缓存满时才调用FileOutputStream write()方法实际写入数据以此实现性能组件与功能组件的完美分离

返回目录 Java程序性能优化让你的Java程序更快更稳定

编辑推荐

Java程序设计培训视频教程

J EE高级框架实战培训视频教程

J ME移动开发实战教学视频

Visual C++音频/视频技术开发与实战

Oracle索引技术

lishixinzhi/Article/program/Java/gj/201311/27821

Java 代理模式和装饰者模式的区别

您好!

代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用。

先来看看装饰者模式的定义:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。比继承的灵活性大。典型的如Java IO的设计即是装饰者模式的典型应用。

代理模式模式的定义:对其他对象进行代理,以控制对被代理对象的访问。Spring的为业务逻辑层方法生成的代理类,主要进行一些事务控制等。

由定义可以看出装饰的责任是扩展功能,而代理主要控制访问。

具体例子可参看Java IO装饰/Spring的动态代理/Hibernate的代理等。

望采纳

关于本次java装饰模式注意什么意思和java的装饰者模式中装饰类为什么不直接实现接口的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

java数据为什么序列化?java里为什么要序列化java持久层是什么意思?java中什么是持久层