我在Java工作
我为图形边创建了一个很好的装饰器结构。我有两个顶点的基边,然后我有一个加权装饰器,为边添加一个权重,然后我有一个定向装饰器,为边添加方向。装饰器是使用接口和委托方法实现的(而不是通过继承)。
现在我想添加另一个装饰器 - 一个流装饰器,对应一个流边缘。流动边缘具有方向和重量(容量)以及流量。我如何在Java中实现这样的东西?我需要像
这样的东西public class FlowEdge implements IEdge, IWeightedEdge, IOrientedEdge, IFlowEdge
{
private IEdge, IWeightedEdge, IOrientedEdge decorated;
private int flow;
//constructors, delegate methods...
但这显然是不可能的。
也许装饰者不是最好用的模式。我想实现关注点的分离(所以我可以有正常的,加权的,定向边的任意组合),但也需要在一个类中可能有多个装饰器的功能。这有点可能吗?还是我过度设计了这个?
答案 0 :(得分:1)
装饰器是使用接口和委托方法实现的(不是 通过继承)。
我认为这可能是你跑到墙上的原因。通过使用继承和多态,装饰器模式在Java中很好地产生了自己。这是“将语言与编程”编程为“一种语言”的一个很好的例子。
答案 1 :(得分:1)
您的设计听起来有缺陷。装饰器通常“包装”他们想要装饰的类,并将其传递给他们的构造函数。你的代码应该是这样的:
Graph myGraph = new BaseGraph();
Graph decoratedGraph = new FlowedGraph(new WeightedGraph(new OrientedGraph(myGraph)));
答案 2 :(得分:1)
我放弃了整个装饰者的想法,并像正常的继承一样实现了边缘。
边缘 - > WeightedEdge - > OrientedEdge - > FlowEdge
它可能没有使用装饰那么优雅,我现在无法拥有未加权的定向边缘,但它简单明了。
答案 3 :(得分:0)
声明装饰器实现的装饰类型似乎是错误的。装饰者确切地知道装饰是什么似乎也是错误的。除了本身提供的新行为之外,您还可以实现依赖于其他装饰器类的“复合装饰器”来添加特定行为。也许是这样的:
public class FlowEdge implements IEdge // or IFlowEdge
{
private IEdge decorated;
private int flow;
public FlowEdge(IEdge decorated) {
this.decorated = new WeightedEdge(new OrientedEdge(decorated));
. . .
}
}