2017-03-08 5 views
0

以下は私のテストコードです。場合は:スクロールバー、余分なサブビュー、背景色、このビューの特殊効果などのような、多くのデコレータをアタッチできるビューを作成しようとします。問題は私が見つけることですi1i2は本当に私です私が必要とするものはwhatINeed1whatINeed2です。この場合、i1i2のポイントは何ですか?この場合、彼らはジェネレータのようになりませんか?この場合、Decorator Designの使い方は?

私はobjective-cでテストしましたが、Javaサンプルコードをオンラインでコピーして調整したため、構文が間違っている可能性があります。

私が最初から間違っている場合は、それを指摘できますか?

public class Decorator { 

abstract class I implements DefaultView { I render(); } 

static class A implements I { public I render() { System.out.print('A'); } } 

static abstract class D implements I { 
    private I core; 
    public D(I inner) { core = inner; } 
    public I render() { return core.render(); } 
} 

static class X extends D { 
    public X(I inner) { super(inner); } 
    public I render() { 
     I i = super.render(); 
     i.setBackgroundColor(); 
    } 
} 

static class Y extends D { 
    public Y(I inner) { super(inner); } 
    public I render() { 
     I i = super.render(); 
     View v = new View(); 
     //This is objective-c similar syntax, 
     //I don't know what's equivalent to Java 
     i.addSubview(v); 
    } 
} 

public static void main(String[] args) { 
    I i1 =new X(new A()) 
    I i2= new Y(new X(new A()))}; 
    I whatINeed1 = i1.render(); 
    I whatINeed2 = i2.render; 
} 

デコレータのデザインについては、既存のコードを変更せずに追加機能を追加しています。下のモデルはどのように達成できますか?どのようにソースコードを変更せずに枠線とスクロールバーを描画するのですか?スクロールバーは元のウィンドウとやり取りする必要があります。私たちは、追加したい

public class PlayerScore{ 
    void setScore(int); 
} 

すなわちデコレーターは通常X.

のソースコードを変更せずに、クラスX(メソッドはのは言わせ)に追加の「機能」を追加するために使用され enter image description here

答えて

1

私たちはラダーで得点のランクを得ることができますが、PlayerScoreを変更したくない/できないようにしています。あなたのコードの外見では、実際には機能を追加していません。基本クラス私はすでにsetBackgroundColor()、addSubView()などの機能を持っています。サブクラスで呼び出すだけです。

これは(コンストラクタにコンポーネントを渡すことによって作られた)合成部は、それがデコレータのように見えるにもかかわらず、むしろデコレーターよりも、継承と構図パターンの混合物のように見えます。

あなたのコードはうまくいきますが、デコレータパターンを使いたい場合は、継承するクラスにさらに多くのメソッドを追加します(PanelViewクラスデコレータに例えば、ボイドスクロール())

詳細情報を追加します。https://en.wikipedia.org/wiki/Decorator_pattern

EDIT(1):親ビューにスクロールバーを追加するためにデコレータを使用するには

、ウィンドウのは言わせて親クラスは何らかの形式を公開する必要があります新しいDecoratedクラスがスクロール動作を実装するために使用できるインタフェースあなたはそれに興味があれば

public class ScrollPane extends Window{ 
    Window component; 
    void renderScrollBar(){ 
     Graphics g = window.getGraphicsHandle(); 
     g.drawRectangle(/** some coords for where to put the bar **/); 
     /** some extra code to add logic on the scroll bar, 
     /** such as shifting the Window content up or down and cull out 
     /** the portion that is outside of the ScrollPane. 
     /** For example, openGL could allow you to do this with scissor 
     /** test **/ 
    } 

    void render(){ 
     component.render(); 
     this.renderScrollPane(); 
    } 
} 

https://www.khronos.org/opengl/wiki/Scissor_Test:ウィンドウは「G」のハンドルを呼ぶことにしましょう、いくつかのグラフィックスAPIへのハンドルを戻した方法を持っていた場合、例えば、その後、デコレータクラスScrollPaneのは、次のことを行うことができますコメントの最後の部分。

これは、あなたがそれについて行くことができる方法です。明らかにうまく機能しているスクロールペインを実装することにはもっと考えがあるかもしれませんが、クラスアーキテクチャーのレイアウトに関しては、GUIを設計する際にDecoratorパターンがうまく機能します。

+0

コメントのためのThx、 'Decoratorは通常、Xのソースコードを変更せずにクラスXに追加の「機能」を追加するために使用されます。私は自分の質問を編集しました。 ? –

関連する問題