2

私は真っ先にデザインパターンを読んでいて、これに気づきました。

「ハリウッドの原則、私たちに電話しないで、私たちはあなたに電話します」

これは、高レベルのコンポーネントが低レベルのコンポーネントに「私たちに電話しないでください、私たちはあなたに電話します」と伝えることを意味します

High-Level Component は、他の Low-Level コンポーネントで定義された BEHAVIOR を持つクラスです。

私の質問は...この例は、私たちに電話しないでください、私たちはあなたを呼ぶという原則に違反していますか?. これもState Patternを使った本から。

public class GumballMachine
{
    //other state instance here

    State NoQuarterState;
    State HasQuarterState;

    public GumballMachine(int numberGumballs)
    {
        NoQuarterState = new NoQuarterState(this);
        HasQuarterState = new HasQuarterState(this);    

        //other state objects here assigning to state instance      
    }

    public void insertQuarter() 
    {   
        state.insertQuarter();  
    }

    void setState(State state) 
    {   
        this.state = state; 
    }

    public State getHasQuarterState() 
    {   
        return hasQuarterState;
    }

    //more code here
}

================================================== ==================

public interface State
{
    //abstract methods
}

================================================== ==================

public class NoQuarterState implements State
{   
    GumballMachine gumballMachine;

    public NoQuarterState(GumballMachine gumballMachine)
    {
        this.gumballMachine = gumballMachine;
    }

    public void insertQuarter()
    {
        System.out.println("You inserted a quarter");
        gumballMachine.setState(gumballMachine.getHasQuarterState()); // change the state to HasQuarterState
    }
}

この例では、GumballMachineは独自のinsertQuarterBehaviorのためにNoQuarterStateinsertQuarterBehavior()を必要とするため、これはGumballMachineクラスが高レベル コンポーネントであり、NoquarterStateクラスが低レベル コンポーネントであることを意味します。しかしNoQuarterStateクラスを見てください。このクラスは、 insertQuarter() Behaviorについて、 gumballMachine の setState()およびgetHasQuarterState()にも依存しています。

それらは互いに依存しています。回覧 - 依存関係

4

3 に答える 3

1

GumballMachineは、州が活動する状況として見る必要があります。このパターンでは、状態が他の状態への参照を取得し、現在の状態を変更できるようにする必要があります。これは、ここでは密結合が意図されていることを意味し、GumballMachineが状態レベルのロジックに依存しないようにしますが、状態のライフサイクルとそれらの共有参照ポイントに責任を負います。

原則とパターンは、設計作業の最終的な目標ではありません。最終的には、目前の問題に適切な解決策を考え出す必要があり、特定のパターンや原則が適用されない場合があります。そうは言っても、何かが間違っている可能性があるという兆候である重要な原則(緩い結合/緊密な凝集など)に本当に違反していることに気付いた場合は、少なくともそれが事実である理由とそれを回避できるかどうかを自問する必要がありますあなたの問題の制約の範囲内で。

于 2012-04-22T13:46:57.447 に答える
1

まず、State Patternについて読む必要があります。
あなたが投稿したものは、それのかなり単純なバージョンです。あなたが投稿したコードでnewは、呼び出されるのはマシン内だけです。これは、状態がマシンに関連付けられている/マシンに属しており、それらをインスタンス化する中央で唯一の場所であるGumballため、実際には悪くありません。それらを追加/削除する唯一の場所でもあります。したがって、具象クラスのインスタンス化はコード内の 1 か所で行われます。 Gumball

これNoQuarterStateはマシン (およびこの件に関してassociatedGumballStateのもの) にあり、これは理にかなっています。なぜなら、NoQuarterStateその処理の後に続く次の正しい状態がどれになるかを知っているのはGumball、各状態の結果に応じてボックスが効果的に移動するからです。このように、ある状態が別の状態にどのように、またはどのような条件下で続くかを知らなくても、Gumballは変化する可能性があります。StateこれはState具体的なインスタンスにカプセル化されています。

実際のところ、そのさまざまなコードとコードでGumballのみ知っています。そして、それが呼び出す唯一のメソッドは、に属し、属していないメソッドなどです。 したがって、これは改善できるかなり単純化された例ですが (ところで、本から例をコピーして貼り付けることは許可されていないと思います)、あなたがそれ自体について尋ねる原則に違反していません。原則の核となる考えは緩い結合に関するものであり、このコードは私見に違反していませんStatesgetterssettersStateNoQuarterState
Holywood

于 2012-04-22T11:55:28.267 に答える
0

はい、まさにあなたが指摘した理由から、ハリウッドの原則に違反しています。しかし、同じ本が強調しているように、原則は法律ではなく、しばしば違反されます。たとえば、コールバックは、ハリウッドの原則に対する一般的で有用な違反です。

于 2013-02-18T00:58:06.823 に答える