装饰器模式限制



我有一个用例,我试图使用装饰器模式,但不确定它是否是使用模式的正确方式。我有2个消息发布者类。第一个发布者接受json作为输入并发布消息第二个发布者将字节作为输入并发布消息

目前这两个是独立的类

public class A {
publish(Json input);
}
public class B {
publish(byte[] input);
}

我想用A来装饰B,而不是创建一个单独的类。基本上,用户将输入作为Json,它将被转换为压缩字节并发布到接收器。但我能想到的问题是,虽然我可以用A装饰B,但我不能用B装饰A,原因是json可以转换为字节流,但所有字节流都不能转换为json格式,这样做会抛出异常。

所有的装饰器类继承相同的父接口,所以可以用任何可能的组合来装饰类。因此,要使装饰器模式正常工作,所有的装饰器必须彼此兼容,而不管它们的应用顺序如何。这种理解是正确的,还是我在装饰模式中遗漏了什么?

所有的decorator类都继承相同的父接口,因此可以以任何可能的组合来装饰类。因此,要使装饰器模式正常工作,所有的装饰器必须彼此兼容,而不管它们的应用顺序如何。这种理解正确吗?

是的,你完全正确。这就是多态性的工作原理。

例如,我们想计算加了奶泡的咖啡的总价。通常,各地的价格类型都是一样的。如果您有不同的类型,那么您需要创建一些转换器类。

让我用c#来展示一个例子。

这是饮料的抽象:

public abstract class Beverage
{
public abstract string GetDescription();
public abstract double GetCost();
}

Espresso为饮料的具体实现:

公共类Espresso: Beverage{GetCost(){返回1;}

public override string GetDescription()
{
return "Espresso";
}

}

这是一些可以添加或装饰到饮料中的添加剂的抽象:

public abstract class BeverageDecorator : Beverage
{
protected Beverage _beverage;
}

WhipDecorator为饮料装饰添加的具体实现:

public class WhipDecorator: BeverageDecorator
{
public WhipDecorator(Beverage beverage)
{
_beverage= beverage;
}
public override double GetCost()
{
return _beverage.GetCost() + 1;
}
public override string GetDescription()
{
return _beverage.GetDescription() + " Whip";
}
}
上面的代码可以这样运行:
Beverage espresso = new Espresso();
espresso = new WhipDecorator(espresso);
double cost = espresso.GetCost(); // OUTPUT: 2
string description = espresso.GetDescription(); // OUTPUT: "Espresso Whip"

我强烈推荐你阅读这本迷人的书Head First Design Patterns, 2nd Edition

相关内容

  • 没有找到相关文章

最新更新