Java与模式:装饰(Decorator)模式

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

装饰模式在Java种使用也非常广泛,比方我们在又一次定义button、对话框等时候,实际上已经在使用装饰模式了。

装饰模式最浅显的样例是相片-相框的样例。

一、原理图

当中类的职责例如以下:

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

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

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

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

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

过程是这种:

项目经理接到一个项目。项目终于要完毕编码。

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

实现代码例如以下:

package com.dashu.decorator;

/**
 * 项目接口
 * */
public interface Project {
	/**
	 * 写代码
	 */
	public void doCoding();
}
package com.dashu.decorator;

/**
 * 代码工人
 * */
public class Employe implements Project {

	//程序猿编码
	@Override
	public void doCoding() {
		System.out.println("代码工人 在编写代码。加班编啊编啊,最终编完了!");
	}
}
package com.dashu.decorator;

/**
 *项目经理
 * */
public class Manager implements Project {
	private Project project; // 实际上存放的是代码工人对象

	public Manager(Project project) {
		this.project = project;
	}

	@Override
	public void doCoding() {
		// 项目经理開始新的工作
		startNewWork();
	}

	/**
	 * 模板:定义项目经理自己的事情
	 */
	public void startNewWork() {
		// 项目经理在做早期工作
		doEarlyWork();
		// 项目经理非常牛,做完需求和设计后,直接将编码委派给代码工人干
		project.doCoding();
		// 项目经理在做收尾工作
		doEndWork();
	}

	/**
	 * 项目经理自己的事情:做早期工作
	 */
	public void doEarlyWork() {
	}

	/**
	 * 项目经理做收尾工作
	 */
	public void doEndWork() {
	}
}
package com.dashu.decorator;

/**
 * 项目经理A
 * */
public class ManagerA extends Manager {

	public ManagerA(Project project) {
		super(project);
		// TODO Auto-generated constructor stub
	}

	/**
	 * 项目经理自己的事情:做早期工作
	 */
	public void doEarlyWork() {
		System.out.println("项目经理A 在做需求分析");
		System.out.println("项目经理A 在做架构设计");
		System.out.println("项目经理A 在做具体设计");
	}

}
package com.dashu.decorator;

/**
 * 项目经理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 在做收尾工作");
	}
}

时间: 2024-12-20 02:13:46

Java与模式:装饰(Decorator)模式的相关文章

java设计模式之 装饰器模式

适AT java设计模式之 装饰器模式 装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,动态给一个对象添提供了额外的功能. 我们通过下面的实例来演示装饰器模式的用法.模拟一个人从想吃饭.找饭店.享受美食.结束吃饭的过程 代码展示: 首先创建一个被修饰的接口 Eat package deco

装饰(Decorator)模式

1.装饰(Decorator)模式    动态给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更为灵活.Component是定义一个对象接口.可以给这些对象动态地添加职责.ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责.Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的.至于ConcreteDecorator就是具体的装饰对象,

Decorator模式 装饰器模式

Android 使用了装饰器模式 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办

修饰者模式(装饰者模式,Decoration)

1. 装饰者模式,动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的替代方案. 2.组合和继承的区别 继承.继承是给一个类添加行为的比较有效的途径.通过使用继承,可以使得子类在拥有自身方法的同时,还可以拥有父类的方法.但是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为的方式和时机. 组合.组合即将一个对象嵌入到另一个对象中,由另一个对象来决定是否引用该对象来扩展自己的行为.这是一种动态的方式,我们可以在应用程序中动态的控制. 与继承相比,组合关系

java设计模式之七装饰器模式(Decorator)

顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能,代码如下: [java] view plaincopy public interface Sourceable { public void method(); } [java] view plaincopy public class Source im

java设计模式之装饰者模式学习

装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为 比如现在有个方法,是过滤文字的方法 1.接口: package com.qiao.wrapper; public interface MessageBoardHandler { public String filter(String msg); } 2.继承者 package com.qiao.w

Java设计模式之装饰者模式

要实现装饰者模式,注意一下几点内容: 1.装饰者类要实现真实类同样的接口 2.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入) 3.装饰类对象在主类中接受请求,将请求发送给真实的对象(相当于已经将引用传递到了装饰类的真实对象) 4.装饰者可以在传入真实对象后,增加一些附加功能(因为装饰对象和真实对象都有同样的方法,装饰对象可以添加一定操作在调用真实对象的方法,或者先调用真实对象的方法,再添加自己的方法) 5.不用继承,   先用实例说话,最后再具体装饰者模式 假设要制造添加甜蜜素和

java模式—装饰者模式

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

java设计模式之装饰器模式

装饰器模式的应用场景:1.需要扩展一个类的功能.2.动态的为一个对象增加功能,而且还能动态撤销.(继承不能做到这一点,继承的功能是静态的,不能动态增删.) 源接口: 1 public interface Sourceable { 2 3 void method(); 4 } Source类: 1 public class Source implements Sourceable { 2 @Override 3 public void method() { 4 System.out.println

java设计模式之装饰器模式以及在java中作用

在JAVA I/O类库里有很多不同的功能组合情况,这些不同的功能组合都是使用装饰器模式实现的,下面以FilterInputStream为例介绍装饰器模式的使用  FilterInputStream和FilterOutputStream 首先,这两个都分别是InputStream和OutputStream的子类.而且,FilterInputStream和FilterOutputStream是具体的子类,实现了InputStream和OutputStream这两个抽象类中为给出实现的方法. 但是,F