Decorator 的应用

03-03-25 manbaum
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);
    }
}
<p>

    

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);
    }
}
<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 则相反,改变了原实现的接口,却没有改变原实现的实现方法。

banq
2003-04-04 14:12
分析得很有道理

coollzh
2003-04-09 22:53
i feel this design pattern is like Delegate & Interface

猜你喜欢
2Go 1 2 下一页