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

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

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

老铁们,大家好,相信还有很多朋友对于java装饰模式注意什么和java的装饰者模式中装饰类为什么不直接实现接口的相关问题不太懂,没关系,今天就由我来为大家分享分享java装饰模式注意什么以及java的装饰者模式中装饰类为什么不直接实现接口的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

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

学java,要注意什么

学习java需要注意要有正确的学习路线,有坚持不懈的学习毅力,也需要有专业老师的指导,这样才能学得更好。

那么,学习Java需要掌握哪些知识和技能呢?这里简单列举一些。

Java学习需要掌握的知识与技能:

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

1、Java SE部分初级语法,面向对象,异常,IO流,多线程,Java Swing,JDBC,泛型,注解,反射等。

2、数据库部分,基础的sql语句,sql语句调优,索引,数据库引擎,存储过程,触发器,事务等。

3、前端部分, HTML5 CSS3 JS, HTML DOM Jquery BootStrap等。

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

4、Java EE部分,Tomcat和Nginx服务器搭建,配置文件,Servlet,JSP,Filter,Listener,http协议,MVC等。

5、框架部分,每个框架都可以分开学,在去学如何使用SSM或者SSH框架,如何搭建,如何整合。开发中为什么会用框架,Rest是啥?Spring为啥经久不衰,底层如何实现等。

6、23种设计模式,掌握常用的,比如单例模式的多种实现,责任链模式,工厂模式,装饰器模式等,了解常用场景。

7、基础算法和数据结构,八大排序算法,查找算法。

8、熟练使用maven等构建工具,git等版本控制工具,熟悉常用linux命令,log4j,dubug,junit单元测试,日志打印工具,Redis等NoSql。

互联网行业目前还是最热门的行业之一,学习IT技能之后足够优秀是有机会进入腾讯、阿里、网易等互联网大厂高薪就业的,发展前景非常好,普通人也可以学习。

想要系统学习,你可以考察对比一下开设有相关专业的热门学校,好的学校拥有根据当下企业需求自主研发课程的能力,建议实地考察对比一下。

祝你学有所成,望采纳。

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

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

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

一、原理图

其中类的职责如下:

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

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

装饰角色(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程序的可移植性)java有什么新特性?java的JDK1.8有什么新特性