2014-01-17 65 views
1

我有A類的一些功能:我是否正確使用裝飾模式?

class A < B { 
    private some_data; 
    public start() { ... }; 
} 

B是一個基類的多個類像A。沒什麼特別的,它從類C繼承。

abstract class C { 
    abstract public start(); 
} 

我有一個抽象的裝飾:

abstract class decoratorC < C { 
    private C; 
    public construct() { 
     self->C->start(); 
    } 
} 

而且混凝土裝飾:

class ConcreteDecoratorForA < decoratorC { 
    public start() { 
     parent->start(); 
     // code here 
    } 
} 

所以,問題是:我需要從A類的私有屬性和這樣的「code here」部分和類B的功能。

我有一個架構錯誤的地方,這可能是一個新的看起來很明顯。也許我需要重構類B的結構。

回答

1

理論上講,裝飾者不應該訪問它所裝飾的類的屬性。裝飾者的想法是在正常行爲之上提供功能。

例如,您可以有一個發送電子郵件的類。然後你會有另一個類,裝飾器,首先記錄消息,然後使用裝飾類發送電子郵件。

裝飾者不應該從它所裝飾的類訪問屬性的原因是它不知道它裝飾了哪個類。在我的電子郵件和日誌記錄的例子中,你可以想象其中的一個層(比如安全)。所以,你將有以下結構:

記錄 - >安全 - >發送郵件

由於裝飾實現了相同的接口裝飾類,這條產業鏈可以在任何你想要的方式來構造。

如果你想從你裝飾的類中訪問數據,你應該將數據作爲合同的一部分(在你的例子中是C)。如果它是特定於子類的,那麼裝飾器將不起作用,因爲你的類不是通用的。