一个有意思的装饰模式样例。
Java与模式:装饰(Decorator)模式
装饰模式使用被装饰类的一个子类的实例,把客户端的调用委派到被装饰类,装饰模式的关键在于这种扩展是完全透明的。
装饰模式在Java种使用也很广泛,比如我们在重新定义按钮、对话框等时候,实际上已经在使用装饰模式了。装饰模式最浅显的例子是相片-相框的例子。
一、原理图
其中类的职责如下:
抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
具体构件角色(Employe):定义一个将要接收附加责任的类
装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任
二、下面通过一个软件项目例子来说明装饰模式的使用
过程是这样的:
项目经理接到一个项目,项目最终要完成编码。
项目经理接到项目后,先做些前期的工作(比如需求分析、设计),然后将编码工作委派给代码工人,代码工人干完后,项目经理做项目的收尾工作。
实现代码如下:
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-3 12:51:06
* 项目
*/
public interface Project {
/**
* 写代码
*/
void doCoding();
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-3 12:51:06
* 项目
*/
public interface Project {
/**
* 写代码
*/
void doCoding();
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-3 12:52:12
* 代码工人
*/
public class Employe implements Project{
/**
* 编码
*/
public void doCoding(){
System.out.println("代码工人 在编写代码,加班编啊编啊,终于编完了!");
}
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-3 12:52:12
* 代码工人
*/
public class Employe implements Project{
/**
* 编码
*/
public void doCoding(){
System.out.println("代码工人 在编写代码,加班编啊编啊,终于编完了!");
}
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-3 12:51:26
* 项目经理
*/
public class Manager implements Project {
private Project project; //实际上存放的是代码工人对象
public Manager(Project project) {
this.project = project;
}
/**
* 编码
*/
public void doCoding() {
//项目经理开始新的工作
startNewWork();
}
/**
* 模板:定义项目经理自己的事情
*/
public void startNewWork() {
//项目经理在做早期工作
doEarlyWork();
//项目经理很牛,做完需求和设计后,直接将编码委派给代码工人干
project.doCoding();
//项目经理在做收尾工作
doEndWork();
}
/**
* 项目经理自己的事情:做早期工作
*/
public void doEarlyWork() {
}
/**
* 项目经理做收尾工作
*/
public void doEndWork() {
}
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-3 12:51:26
* 项目经理
*/
public class Manager implements Project {
private Project project; //实际上存放的是代码工人对象
public Manager(Project project) {
this.project = project;
}
/**
* 编码
*/
public void doCoding() {
//项目经理开始新的工作
startNewWork();
}
/**
* 模板:定义项目经理自己的事情
*/
public void startNewWork() {
//项目经理在做早期工作
doEarlyWork();
//项目经理很牛,做完需求和设计后,直接将编码委派给代码工人干
project.doCoding();
//项目经理在做收尾工作
doEndWork();
}
/**
* 项目经理自己的事情:做早期工作
*/
public void doEarlyWork() {
}
/**
* 项目经理做收尾工作
*/
public void doEndWork() {
}
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-3 13:45:18
* 具体的项目经理A
*/
public class ManagerA extends Manager{
public ManagerA(Project project) {
super(project);
}
/**
* 项目经理自己的事情:做早期工作
*/
public void doEarlyWork() {
System.out.println("项目经理A 在做需求分析");
System.out.println("项目经理A 在做架构设计");
System.out.println("项目经理A 在做详细设计");
}
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-3 13:45:18
* 具体的项目经理A
*/
public class ManagerA extends Manager{
public ManagerA(Project project) {
super(project);
}
/**
* 项目经理自己的事情:做早期工作
*/
public void doEarlyWork() {
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
*/
public class ManagerB extends Manager {
public ManagerB(Project project) {
super(project);
}
/**
* 项目经理自己的事情:做早期工作
*/
public void doEarlyWork() {
System.out.println("项目经理B 在做需求分析");
System.out.println("项目经理B 在做详细设计");
}
/**
* 项目经理做收尾工作
*/
public void doEndWork() {
System.out.println("项目经理B 在做收尾工作");
}
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-3 13:45:27
* 具体的项目经理B
*/
public class ManagerB extends Manager {
public ManagerB(Project project) {
super(project);
}
/**
* 项目经理自己的事情:做早期工作
*/
public void doEarlyWork() {
System.out.println("项目经理B 在做需求分析");
System.out.println("项目经理B 在做详细设计");
}
/**
* 项目经理做收尾工作
*/
public void doEndWork() {
System.out.println("项目经理B 在做收尾工作");
}
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-3 13:03:22
* 客户端测试
*/
public class Client {
public static void main(String args[]) {
Project employe = new Employe(); //代码工人
Project managerA = new ManagerA(employe); //项目经理
Project managerB = new ManagerB(employe); //项目经理
//以经理的名义将编码完成,功劳都是经理的,实际编码的是工人
managerA.doCoding();
managerB.doCoding();
}
}
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-3 13:03:22
* 客户端测试
*/
public class Client {
public static void main(String args[]) {
Project employe = new Employe(); //代码工人
Project managerA = new ManagerA(employe); //项目经理
Project managerB = new ManagerB(employe); //项目经理
//以经理的名义将编码完成,功劳都是经理的,实际编码的是工人
managerA.doCoding();
managerB.doCoding();
}
}
运行结果:
项目经理A 在做需求分析
项目经理A 在做架构设计
项目经理A 在做详细设计
代码工人 在编写代码,加班编啊编啊,终于编完了!
项目经理B 在做需求分析
项目经理B 在做详细设计
代码工人 在编写代码,加班编啊编啊,终于编完了!
项目经理B 在做收尾工作
Process finished with exit code 0
项目经理A 在做架构设计
项目经理A 在做详细设计
代码工人 在编写代码,加班编啊编啊,终于编完了!
项目经理B 在做需求分析
项目经理B 在做详细设计
代码工人 在编写代码,加班编啊编啊,终于编完了!
项目经理B 在做收尾工作
Process finished with exit code 0
相关推荐
9. 装饰模式:装饰模式动态地给对象添加一些额外的职责,提供比继承更具有弹性的扩展方式。 10. 外观模式:外观模式为复杂的子系统提供了一个简单的接口,简化了客户端代码。 11. 享元模式:享元模式通过共享技术...
第八讲:装饰模式 第九讲:策略模式 第十讲:观察者模式 第十一讲:享元模式 第十二讲:代理模式 第十三讲:外观模式 第十四讲:组合模式 第十五讲:桥接模式 第十六讲:适配器模式 第十七讲:解释器模式 ...
- **ConcreteComponent(具体组件)**:实现了Component接口的类,是装饰模式要装饰的目标对象。它定义了初始行为,不包含任何额外装饰。 - **Decorator(装饰者)**:持有对Component对象的引用,并且实现...
装饰者模式(Decorator)是一种设计模式,用于在运行时动态地给对象添加额外的责任或功能。它是结构型设计模式的一种,能将行为的增加与对象的创建分离,使得我们可以独立地扩展对象的功能。 在Java或其他面向对象...
装饰者模式是面向对象设计中的一种行为模式,它允许在运行时给对象添加新的行为或职责,而无需改变其原始类。这种模式的核心思想是通过将对象包装在一个装饰类中来扩展其功能,装饰类与被装饰类具有相同的接口,因此...
装饰模式是一种结构型设计模式,它允许在运行时给对象添加新的行为或责任,而无需修改对象的源代码。这种模式通过将附加功能封装到一个称为装饰者的对象中来实现,使得原有的对象类保持不变,扩展了其功能。在软件...
4. **装饰者模式(Decorator Pattern)**:装饰者模式是一种结构设计模式,允许向一个对象动态添加新功能,而无需修改其源代码。 5. **策略模式(Strategy Pattern)**:策略模式是一种行为设计模式,定义了一系列...
8. 装饰模式(Decorator):装饰模式动态地给对象添加新功能,而不会破坏类的封装性,提供了一种比继承更灵活的扩展方式。 9. 门面模式(Facade):门面模式提供一个简单的统一接口,隐藏了复杂的子系统,使得...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...
装饰模式是一种结构型设计模式,它允许我们向一个对象添加新的功能或改变其行为,而无需修改原有对象的代码。这种模式在不破坏封装性的前提下,动态地给对象增加功能,提高了系统的可扩展性和可维护性。装饰模式通常...
8. **装饰器模式**:动态地给一个对象添加一些额外的职责,提供比继承更具弹性的替代方案。 9. **组合模式**:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用...
- 中期目标:6个月内转型为团购模式,组织团购活动,12个月时日访问量超过10000。 - 长期目标:24个月内成为滨海新区的首要装饰装修交流平台,举办各类活动,与媒体合作。 3. **4C导向的网站建设**: - 准确寻找...
- 装饰模式(Decorator):装饰模式可以在运行时动态地给对象添加新的责任,它提供了比继承更多的灵活性,避免因为扩展功能而频繁修改类的结构。 - 桥接模式(Bridge):桥接模式将抽象部分与实现部分分离,使得...
装饰者模式是一种设计模式,属于结构型模式,它在不改变对象自身的基础上,动态地给对象添加一些职责或行为。这种模式通常用于当对现有对象的功能进行扩展时,避免对对象进行子类化,以此来减少类的爆炸性增长和提高...
11. **装饰模式**:装饰模式允许向一个现有的对象添加新的行为,同时又不改变其原有的结构。 12. **享元模式**:享元模式运用共享技术有效地支持大量细粒度的对象,通过共享相同的对象以减少内存使用。 13. **外观...
装饰模式可以在运行时给对象动态添加职责,而不改变其原始接口。相比子类化,装饰模式提供了更灵活的扩展功能的方式。 10. 外观模式或门面模式(Facade Pattern): 外观模式为子系统提供了一个统一的接口,简化...
Decorator模式,也称为装饰模式,是设计模式中的一个重要组成部分,它在不改变原有对象接口的前提下,动态地给对象添加新的功能,从而扩展了对象的能力。这篇博客(<https://janeky.iteye.com/blog/472502>)将深入...
在这个"实验3:结构型模式应用实验(2)"中,我们将主要涉及以下几种常见的结构型模式: 1. **代理模式(Proxy Pattern)**:代理模式为其他对象提供一种代理以控制对这个对象的访问。在Java中,代理模式可以动态地...
- **装饰模式**:装饰模式动态地给一个对象添加一些新的行为,提供了比继承更有弹性的扩展对象功能的方式。 - **外观模式**:外观模式为子系统提供了一个统一的接口,使得客户端可以不必了解子系统内部的复杂性。 ...
8. 装饰器模式:装饰器模式在运行时动态地给对象添加新的行为或责任。在Java IO库中,许多流类就是通过装饰器模式实现的,可以按需添加读写功能。 9. 外观模式:外观模式提供了一个简单的接口,用于客户端访问一个...