Decorator 的应用

    
manbaum 03-03-25

Decorator 其实是很普通的技术,估计大家都在用它而没有把它抽象为一种模式而已。其核心就是对已有的实现中可覆盖的方法进行覆盖,以便增加新的功能。

如 banq 在 Decorator 中所述,为了在打桩前做些必要的准备工作,比方要在方型桩上先钉个钉子(即所谓修饰),实现如下所述:

public interface IPeg
{
void Insert(String message);
}

public SquarePeg implements IPeg
{
public void Insert(String message)
{
// ...
}
}

public DecoratedSquarePeg extends SquarePeg
{
private void AddNail()
{
// 加钉子 ...
}

public void Insert(String message)
{
AddNail();
super.Insert(message);
}
}

banq
2003-03-26 10:16

是这样,Decorator 用起来太普遍,我们不知不觉的就在用它。

manbaum
2003-04-03 12:18


上次我贴的的实现有个问题,就是如果有大量不同的桩(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);
}
}


这样,对于使用桩子的函数,如:

void DoSomeWork(IPeg peg)
{
// ... get message ...
peg.Insert(message);
}

并不需要知道桩子有没有修饰,你可以
DoSomeWork(new SquarePeg());
也可以
DoSomeWork(new DecoratedPeg(new SquarePeg()));

感觉上说, Decorator 和 Adapter 有类似的地方,都是对一个已经实现了的类进行了新的包装。但是 Decorator 是对实现的包装,而 Adapter 是对接口的包装。即:Decorator 没有改变原实现的接口,而改变了接口的实现方法;而 Adapter 则相反,改变了原实现的接口,却没有改变原实现的实现方法。

banq
2003-04-04 14:12

分析得很有道理

coollzh
2003-04-09 22:53

i feel this design pattern is like Delegate & Interface

2Go 1 2 下一页