为了账号安全,请及时绑定邮箱和手机立即绑定

何时使用装饰图案?

/ 猿问

何时使用装饰图案?

守候你守候我 2019-09-21 13:45:39

我正在研究设计模式,在我的编码中尚未认真使用的一种模式是Decorator模式。

我了解该模式,但是我想知道的是现实世界中一些很好的具体示例,其中装饰器模式是最佳/最佳/优雅的解决方案。在特定情况下,非常需要装饰器模式。

谢谢。


查看完整描述

3 回答

?
慕仰0522570

装饰器模式在流中使用很多:您可以将流与流包装在一起以获得更多功能。我已经在.Net框架中看到了这一点-据我所知,这发生在其他地方。我最喜欢的是在FileStream周围使用GZipStream,以增加压缩率。


查看完整回答
反对 回复 2019-09-21
?
慕田峪4524236

装饰器模式用于向特定对象(而不是一类对象)添加其他功能。通过子类化对象来向整个对象类添加功能很容易,但是不可能以这种方式扩展单个对象。使用装饰器模式,您可以向单个对象添加功能,而其他对象则保持不变。


在Java中,装饰器模式的经典示例是Java I / O流实现。


FileReader       frdr = new FileReader(filename);

LineNumberReader lrdr = new LineNumberReader(frdr);

前面的代码创建了一个读取器-- lrdr从文件中读取并跟踪行号。第1行创建文件阅读器(frdr),第2行添加行号跟踪。


实际上,我强烈建议您查看Java I / O类的Java源代码。


查看完整回答
反对 回复 2019-09-21
?
繁星淼淼

我最近在Web服务中使用了装饰器模式,该服务使用以下CommandProcessor接口:


public Command receive(Request request);

public Response execute(Command command);

public void respond(Response response);

基本上,CommandProcessor接收请求并创建适当的命令,执行命令并创建适当的响应,然后发送响应。当我想添加计时并将其记录时,我创建了一个TimerDecorator,它使用现有的CommandProcessor作为其组件。TimerDecorator实现了CommandProcessor接口,但是只是添加了计时,然后调用了它的目标,即真正的CommandProcessor。像这样:


public class TimerDecorator implements CommandProcessor {

   private CommandProcessor target;

   private Timer timer;


   public TimerDecorator(CommandProcessor processor) {

      this.target = processor;

      this.timer = new Timer();

   }


   public Command receive(Request request) {

      this.timer.start();

      return this.target.receive(request);

   }


   public Response execute(Command command) {

      return this.target.execute(command);

   }


   public void respond(Response response) {

      this.target.response(response);

      this.timer.stop();

      // log timer

   }


}

因此,真正的CommandProcessor包装在TimerDecorator中,我可以像对待目标CommandProcessor一样对待TimerDecorator,但现在已添加了计时逻辑。


查看完整回答
反对 回复 2019-09-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信