我认为公平地说,他们彼此非常相似。唯一不同的是我所知道的意图。
责任链:通过给多个对象处理请求的机会,避免请求发送方与接收方之间的耦合。将接收对象链接起来,并沿着链传递请求,直到对象处理为止。并非所有对象都有机会或能够处理请求。
装潢者:动态地将额外的责任附加到对象上。装饰师为扩展功能提供了一种灵活的子类选择。所有装饰对象都通过以自己的方式增强数据来处理请求。
但是,如果实现的话,会有区别吗?除了在责任链中你可以在任何时候打破这条链之外?
下面是Decorator模式的示例。但如果你让我写一个责任链的例子,我也可以写同样的例子。
是的,我还可以添加一个条件,检查请求是否将被进一步转发,如果没有,则断开链。但这是否是它必须具备的责任链模式呢?
如果不是,那么以下不是责任链和装饰模式的例子吗?责任链是否只有一个额外的如果条件,检查它是否要被转发?或者还有更多?
public interface IStream
{
void write(string data);
}
public class CloudStream : IStream
{
public void write(string data)
{
Console.WriteLine("Writing to cloud storage..");
}
}
public class EncryptStream : IStream
{
private IStream stream { get; set; }
public EncryptStream(IStream stream)
{
this.stream = stream;
}
public void write(string data)
{
Console.WriteLine("Encrypting stream..");
var encryptedData = Encrypt(data);
this.stream.write(data);
}
private object Encrypt(string data)
{
return data; // return encrypted data
}
}
public class CompressStream : IStream
{
private IStream stream { get; set; }
public CompressStream(IStream stream)
{
this.stream = stream;
}
public void write(string data)
{
var compressedData = Compress(data);
Console.WriteLine("Compressing stream..");
this.stream.write(data);
}
private object Compress(string data)
{
return data;
}
}发布于 2021-06-28 16:56:49
有趣的问题。
是的,我还可以添加一个条件,检查请求是否将被进一步转发,如果没有,则断开链。但这是否是它必须具备的责任链模式呢?
是的,根据戈夫的严格定义:
如果ConcreteHandler能够处理请求,它就会这样做;否则,它会将请求转发给后续程序。但是,如果实现的话,会有区别吗?除了在责任链中你可以在任何时候打破这条链之外?
它们的类图也略有不同:


如您所见,响应链的successor属性引用类本身,而Decorator模式的component属性引用另一个类。
https://softwareengineering.stackexchange.com/questions/429772
复制相似问题