『壹』 1. 装饰器模式解决了软件设计的什么问题 有什么优点 请举例说明该设计模式的应用场景。
装饰者模式(Decorator Pattern),是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
使用装饰者模式的时候需要注意一下几点内容:
(1)装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
(2)装饰对象包含一个真实对象的引用。
(3)装饰对象接受所有的来自客户端的请求,它把这些请求转发给真实的对象。
(4)装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。然而,装饰者模式,不需要子类可以在应用程序运行时,动态扩展功能,更加方便、灵活。
适用装饰者模式场合:
1.当我们需要为某个现有的对象,动态的增加一个新的功能或职责时,可以考虑使用装饰模式。
2.当某个对象的职责经常发生变化或者经常需要动态的增加职责,避免为了适应这样的变化,而增加继承子类扩展的方式,因为这种方式会造成子类膨胀的速度过快,难以控制。
推荐你一本设计模式方面的优秀书籍:郑阿奇 主编的《软件秘笈-设计模式那点事》。里面讲解很到位,实例通俗易懂,看了收获很大!
祝你早日学会设计模式!
『贰』 关于java中装饰者模式的详解,不理解啊,,谁给解释解释。。。
装饰者模式可以动态地给一个对象增加其他职责。就扩展对象功能来说,装饰者模式比生成子类更为灵活。(定义)
不给你写代码了,写了估计你也不看。
简单的给你解释吧:你只会做一件事情A,我想让你去做B-A这件事情,不改变你的行为,你肯定不会做的。但是小明会做另一件事情B,所以我就可以让小明去做B,并且告诉小明做完后 如果遇见你 就让你做事情A。让后我们你们两个放在一块,让小明做B,然后事情B-A就可以被做了。同样我想完成事情C-A,只要找到会做C的小王就可以了。
在这里你就是被装饰者,小明和小王就是装饰者。之所以把你叫做装饰者,可能是因为你做的事情是主要的事情。其实这些都是可以灵活利用的 。
建议你看书 header first 设计模式
如果想看代码,网络太多了。
如果不明白,可以追问。
『叁』 装饰者模式:上次去面试,面试官问我知道哪些设计模式,我有说装饰者模式,他问我java.util包里面有一个类
装饰者模式就是动态的给对象添加一些职责。就功能来说装饰着模式相对与生成子类更加灵活。
当然继承也能实现该功能,但是面向对象的基本原则之一就是:少用继承,多用组合。
java.util中set就是,hashset和collection的源码很容易看出,他们是装饰者模式的构造。
『肆』 关于如何理解装饰者模式
对于问题不是很明确 无法正确回答~ 任何关于装修的知识可以帮你解答
希望可以帮到你
点击我的ID,可以了解更多关于装修的知识
『伍』 java问题 想问下 装饰者模式有什么实际用途呢能举个实际应用的例子吗
装饰者模式用来扩展对象的功能,给对象添加不同的功能。在io流中,比如 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("d:/text.txt")))); 这种对File类的包装,由内层到外层扩展输入流的功能,就是一个典型的装饰者模式。inputstream是被装饰对象,然后Fileinputstream、InputStream、BufferedReader都是它的装饰器,用来扩展它的功能!
『陆』 关于java装饰者模式的一个小问题。
其实我觉得装饰者和代理模式很像。这里我觉得就是代理模式。worker帮aworker把事情给做了。不过aworker的功能又不只是worker的功能,它还可以有别的功能,比如又传来一个bworker给它,它就又扩展了一种功能了。
『柒』 java的装饰者模式中装饰类为什么不直接实现接口
装饰模式使用被装饰类的一个子类的实例,把客户端的调用委派到被装饰类,装饰模式的关键在于这种扩展是完全透明的。
装饰模式在Java种使用也很广泛,比如我们在重新定义按钮、对话框等时候,实际上已经在使用装饰模式了。装饰模式最浅显的例子是相片-相框的例子。
一、原理图
其中类的职责如下:
抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
具体构件角色(Employe):定义一个将要接收附加责任的类
装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任
二、下面通过一个软件项目例子来说明装饰模式的使用
过程是这样的:
项目经理接到一个项目,项目最终要完成编码。
项目经理接到项目后,先做些前期的工作(比如需求分析、设计),然后将编码工作委派给代码工人,代码工人干完后,项目经理做项目的收尾工作。
实现代码如下:
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2008-8-3 12:51:06
* 项目
*/
publicinterfaceProject {
/**
* 写代码
*/
voiddoCoding();
}
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2008-8-3 12:52:12
* 代码工人
*/
{
/**
* 编码
*/
publicvoiddoCoding(){
System.out.println("代码工人 在编写代码,加班编啊编啊,终于编完了!");
}
}
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2008-8-3 12:51:26
* 项目经理
*/
{
privateProject project;//实际上存放的是代码工人对象
publicManager(Project project) {
this.project = project;
}
/**
* 编码
*/
publicvoiddoCoding() {
//项目经理开始新的工作
startNewWork();
}
/**
* 模板:定义项目经理自己的事情
*/
publicvoidstartNewWork() {
//项目经理在做早期工作
doEarlyWork();
//项目经理很牛,做完需求和设计后,直接将编码委派给代码工人干
project.doCoding();
//项目经理在做收尾工作
doEndWork();
}
/**
* 项目经理自己的事情:做早期工作
*/
publicvoiddoEarlyWork() {
}
/**
* 项目经理做收尾工作
*/
publicvoiddoEndWork() {
}
}
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2008-8-3 13:45:18
* 具体的项目经理A
*/
{
publicManagerA(Project project) {
super(project);
}
/**
* 项目经理自己的事情:做早期工作
*/
publicvoiddoEarlyWork() {
System.out.println("项目经理A 在做需求分析");
System.out.println("项目经理A 在做架构设计");
System.out.println("项目经理A 在做详细设计");
}
}
/**
* Created by IntelliJ IDEA.
* User: leimin
* Date: 2008-8-3 13:45:27
* 具体的项目经理B
*/
{
publicManagerB(Project project) {
super(project);
}
/**
* 项目经理自己的事情:做早期工作
*/
publicvoiddoEarlyWork() {
System.out.println("项目经理B 在做需求分析");
System.out.println("项目经理B 在做详细设计");
}
/**
* 项目经理做收尾工作
*/
publicvoiddoEndWork() {
System.out.println("项目经理B 在做收尾工作");
}
}
/**
* Created by IntelliJ IDEA.
* User: leimin
* 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 代理模式和装饰者模式的区别
代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用。
先来看看装饰者模式的定义:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。比继承的灵活性大。典型的如Java IO的设计即是装饰者模式的典型应用。
代理模式模式的定义:对其他对象进行代理,以控制对被代理对象的访问。Spring的为业务逻辑层方法生成的代理类,主要进行一些事务控制等。
由定义可以看出装饰的责任是扩展功能 ,而代理主要控制访问。
具体例子可参看Java IO装饰/Spring的动态代理/Hibernate的代理等。
『玖』 java的i/o类中有哪些用到了装饰者模式
装饰者模式用来扩展对象的功能,给对象添加不同的功能。
在io流中,比如
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("d:/text.txt"))));
这种对File类的包装,由内层到外层扩展输入流的功能,就是一个典型的装饰者模式。inputstream是被装饰对象,然后Fileinputstream、InputStream、BufferedReader都是它的装饰器,用来扩展它的功能!
『拾』 Java装饰者模式,被增强类的方法为什么可以调用
你main方法是静态方法, 静态方法是不能调用非静态方法。 因为静态方法是提前加载的。这个时候可能非静态方法根本就还没加载。所以,是部允许在静态方法里面调用非静态方法的。 可以在静态方法中,获得非静态方法所在的类的对象实例。 在静态方法中,用这个实例去调用非静态方法。 比如: A a = new A(); a.aaaaa();