`

设计模式总结之装饰模式 (Decorator)

阅读更多

装饰模式(Decorator)就是使用被装饰的一个子类的实例,在客户端将这个子类的实例委托给装饰类。装饰模式是结成关系的一个替代方案。

装饰模式以对客户端透明的方式增添了对象的功能,其在与动态的给对象添加了责任,当然这里的继承便是静态的。

其中重要的地方时装饰对象和真实对象有相同的接口,这样客户端就可以和真是对象一样的交互方式和装饰对象交互,然后装饰对象把所有从客户端接收过来的请求全部转发给真是对象,然后在返还给客户端,这样装饰对象就可以再转发前或者以后添加一些附加功能而不影响对真是对象的操作,这样在不改变原有类的基础上,可以实现对于原有类的这种额外功能的实现,增强了程序的复用性。

同时装饰模式比继承好的地方就是,装饰模式可以动态的对已经存在的类进行任意的组合,实现想要的功能,而继承是静态的实现,不能改变原有类的实现,如果要添加更多的功能,只有添加更多的派生类来实现。

下面以员工加工画为例子实现装饰者模式

抽象组件Work.java

 

package decorator;
 
public abstract class Work {
     public abstract void painting();
}

 

 

 装饰者1Work.java
package decorator;

public class WorkerOne extends Work {
	@Override
	public void painting() {
          System.out.println("1号员工画画");
	}

}
 装饰者3Work.java
package decorator;

public class WorkerThree extends Work {
	//被装饰者
	private Work work;
	 
	public WorkerThree(Work work) {
	    this.work = work;
	}
	 
	private WorkerThree() {}
	
	@Override
	public void painting() {
          System.out.println("3号员工上画框前前的准备工作。");
          //被装饰者做的职责
          work.painting();
          //装饰者做的职责
          System.out.println("3号员工上画框。");
	}

}
 装饰者2Work.java
package decorator;

public class WorkerTwo extends Work {
	//被装饰者
	private Work work;
	 
	public WorkerTwo(Work work) {
	    this.work = work;
	}
	 
	private WorkerTwo() {}
	
	@Override
	public void painting() {
          System.out.println("2号员工给画上颜色前的准备工作。");
          //被装饰者做的职责
          work.painting();
          //装饰者做的职责
          System.out.println("2号员工给画上好了颜色。");
	}

}
 测试类
package decorator;

public class Test {

	public static void main(String[] args) {
		
		System.out.println("*****只做画画工作*****");
		WorkerOne workerOne = new WorkerOne();
        workerOne.painting();
        
        System.out.println("*****只做上色工作*****");
        WorkerTwo workerTwo = new WorkerTwo(workerOne);
        workerTwo.painting();
        
        System.out.println("****做全部工作*****");
        WorkerThree workerThree = new WorkerThree(workerTwo);
        workerThree.painting();
	}

}
 适用装饰者模式场合:
1.当我们需要为某个现有的对象,动态的增加一个新的功能或职责时,可以考虑使用装饰模式。
2.当某个对象的职责经常发生变化或者经常需要动态的增加职责,避免为了适应这样的变化,而增加继承子类扩展的方式,因为这种方式会造成子类膨胀的速度过快,难以控制。
装饰模式模式可以说是代理模式的一个特殊应用,甚至可以认为他们结构上是一致的;只是他们关心地方不同,代理模式关心对象方法的预处理和善后处理,装饰模式关心对象方法的“增强”(注意:不是“增加”)或“减弱”。
责任链模式将多个处理对象聚合成一条链状,被处理对象直接交由链头处理,它会在链中被依次传递下去直到处理完成或到达最后一个处理对象为止。责任链模式可以将请求和处理分开,但是要注意链过长时的性能问题和链中节点数量问题。
策略模式提供了一种动态改变对象方法行为的途径;它的实现是将算法封装起来,对象中使用Setter(或构造函数)接收具体算法对象,然后在对象方法被调用时执行接收到的具体算法。
javaIO就是一个典型的装饰者的例子,我们可以直接使用

 

将输入流字符改为小写LowerCaseInputStream.java

 

package javaIO;

import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;

public class LowerCaseInputStream extends FilterInputStream {

	protected LowerCaseInputStream(InputStream in) {
		super(in);
	}

	public int read() throws IOException{
		int i = super.read();
		return i==-1?i:Character.toLowerCase(i);
	}
	
	public int read(byte[] b,int off,int len) throws IOException{
		int result = super.read(b, off, len);
		for(int i=off;i<off+result;i++){
			b[i] = (byte)Character.toLowerCase(b[i]);
		}
		return result;
	}
}
 测试类
package javaIO;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class Test {

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

		int c;
		try {
			InputStream in = new LowerCaseInputStream(
					new BufferedInputStream(
							new FileInputStream("test.txt")));
			
			while((c=in.read())>=0){
				System.out.print((char)c);
			}
			
//			byte[] b=new byte[3];
//			while((c=in.read(b,0,3))>=0){
//				for(int i=0;i<3;i++){
//					System.out.print((char)b[i]);
//				}
//			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

}
 

 

分享到:
评论

相关推荐

    C#设计模式之Decorator 装饰模式

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    设计模式之 Decorator模式和代码实现

    【Decorator模式】是一种设计模式,它允许在运行时动态地给对象添加新的责任或功能,而不必通过子类化的方式。在上述的奇幻RPG游戏中,Decorator模式被用来实现武器的锻造过程,尤其是武器镶嵌宝石的功能。这个过程...

    c++-设计模式之装饰模式(Decorator)

    装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...

    设计模式C++学习之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...

    Java设计模式之-Decorator装饰模式

    Decorator模式,也称为装饰模式,是设计模式中的一个重要组成部分,它在不改变原有对象接口的前提下,动态地给对象添加新的功能,从而扩展了对象的能力。这篇博客()将深入探讨这个模式的细节。 装饰模式的核心...

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许动态地给一个对象添加新的功能,而无需修改其原有代码。这个模式的核心思想是通过将对象封装在一个包装器(Decorator)中来扩展其行为,而包装器和原始...

    设计模式--装饰者模式java例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

    设计模式之Decorator

    《设计模式之Decorator》 设计模式是软件工程中的一种最佳实践,它是在特定场景下解决常见问题的经验总结。Decorator模式是一种结构型设计模式,它的主要作用是为对象添加额外的功能,而无需修改对象的源代码。...

    李建忠 C#面向对象设计模式纵横谈(25):设计模式总结

    总结来说,李建忠先生的“设计模式总结”涵盖了C#中广泛使用的设计模式,强调了它们在实际项目中的应用价值。理解并熟练运用这些模式,对于提升C#开发者的专业素养和项目质量具有重大意义。无论是初学者还是经验丰富...

    大话西游之设计模式_从猴王学艺看Decorator 配套代码

    "大话西游之设计模式_从猴王学艺看Decorator"这篇文章将设计模式的概念与经典电影《大话西游》中的故事相结合,以生动有趣的方式讲解了Decorator模式。猴王学艺的过程,就如同我们在编程中逐步增加对象的能力,通过...

    PHP设计模式(八)装饰器模式Decorator实例详解【结构型】

    装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...

    设计模式之装饰模式

    在给定的标题“设计模式之装饰模式”中,我们可以深入探讨以下几个方面: 1. **装饰模式的基本结构**:装饰模式通常包括四个角色:抽象组件(Component)接口,具体组件(Concrete Component)类,抽象装饰...

    设计模式 t07Decorator

    总结来说,“设计模式 t07Decorator”着重介绍的是如何使用装饰者模式来动态地扩展对象的功能,它强调了面向对象设计中的灵活性和可扩展性,是软件开发中一个重要的设计原则和工具。通过理解和应用装饰者模式,我们...

    设计模式之装饰者(Decorator)

    装饰者模式是软件设计中的一种行为模式,它允许在运行时动态地给对象添加新的行为或职责,而无需改变对象的原始类。这种模式在不违反开闭原则的前提下,提供了扩展对象功能的能力,使得系统更加灵活,易于维护。 在...

    java Decorator装饰模式例子

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...

    装饰器模式[Decorator]

    装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...

Global site tag (gtag.js) - Google Analytics