上次我贴的的实现有个问题,就是如果有大量不同的桩(M 种)需要做各种不同的装饰(N 种),则需要 (M*N) 种的组合来实现Peg子类,显然不合理,所以改变为另一种方式实现修饰,这样只需要实现 (M+N) 种组合。如下所述:
public DecoratedPeg implements IPeg
{
private IPeg _peg;
public DecoratedPeg(IPeg peg)
{
_peg = peg;
}
private AddNail()
{
// ...
}
public void Insert(String message)
{
AddNail();
_peg.Insert(message);
}
}
<p>
|
这样,对于使用桩子的函数,如:
void DoSomeWork(IPeg peg)
{
// ... get message ...
peg.Insert(message);
}
<p>
|
并不需要知道桩子有没有修饰,你可以
DoSomeWork(new SquarePeg());
也可以
DoSomeWork(new DecoratedPeg(new SquarePeg()));
感觉上说, Decorator 和 Adapter 有类似的地方,都是对一个已经实现了的类进行了新的包装。但是 Decorator 是对实现的包装,而 Adapter 是对接口的包装。即:Decorator 没有改变原实现的接口,而改变了接口的实现方法;而 Adapter 则相反,改变了原实现的接口,却没有改变原实现的实现方法。