0

OOP 設計に関する質問があります (私は Java を使用していますが、質問はより一般的です)。ホーム オートメーション シミュレーターをプログラミングしていますが、設計に問題があります。TelevisionHeatingのように、 volumeUp()などの対応するメソッドを持つ各アプライアンスのクラスがあります...イベントを生成し、それらに対してアクションを実行するアプライアンスとセンサーのクラスを分離したいと思います。考えられることは次のとおりです。オブザーバー パターンを実装して、センサーからアラーム クラスにイベントを伝達します。アラーム クラスは次のようになります。

class Alarm implements Observer {
    Action action;
    public update(...) { action.do() }
}

ここで、ユーザーがユーザー インターフェイスでトリガーするセンサーとアクションを任意に結合できるようにしたいので、各アプライアンスのアクションごとに個別のクラスを作成することを考えました。

class ActionTVVolumeUp implements Action {
    Television tv;
    ActionTVVolumeUp(Television tv) { this.tv = tv; }
    public void do() { tv.volumeUp() }
}

次に、ユーザーがユーザー インターフェイスでセンサー (MotionSensor、LightSensor、...) を指定し、トリガーするアクションを指定すると、目的のセンサーを監視する目的のアクションでアラーム インスタンスが作成されます。これに関する問題は、非常に多くのアクション クラスが必要になることです (アプライアンスが実装する VolumeControllable などのインターフェイスを使用して、アクション クラスを少し減らすことができます)。

私が欠けているものはありますか?これはより簡単に/多くの Action クラスを使用する必要なしに行うことができますか? ありがとうございました。

4

2 に答える 2

0

一般的なイベント ハンドラーを実装するための一般的な pub-sub コントローラーはどうでしょうか。TV デバイスの代わりに、TV という名前のアプライアンス インスタンスを作成します。各アプライアンスで、その特定のアプライアンスに適したコマンドを追加します。また、コマンドは別のアプライアンスと通信することはなく、常にコントローラーと通信します。このようにして、コントローラーはすべてのアプライアンスのすべての状態のコピーを維持し、変更が行われるたびに認識し、変更が必要な時期も認識します。

このようにして、コントローラーはルールを処理できます (または、ルール アプライアンスをコントローラーに接続することもできます。「if living-room-tv is turn-on-event AND motion-detector-living-room was active in the最後の 60 秒間 リビングルームの照明を暗くするシナリオを実行する"

明らかに、アプライアンスが自分自身を制御したい場合に問題が発生します (テレビのチャンネル アップ ボタンを押した場合、コントローラーはどのように認識しますか?)。ルールが正しいことを実行できるように、常に正しい状態になります。

特定のアプライアンス アクティビティをクラスに埋め込むことを避け、代わりに実行可能なアクションに関連付けられた名前を一般的に処理することができれば、永遠に柔軟になるはずです。

于 2014-06-26T19:10:06.833 に答える
0

次のことはどうでしょうか。各アプライアンスは、実行できるアクションのルックアップを提供します。たとえば、人が読める名前をメソッドにマップする辞書です。各センサーには、トリガーされたときに呼び出すアクション (メソッド) のリストがあります。UI はセンサーにメソッドを追加するだけです。

C# では、センサーのメソッド リストはイベント ハンドラーになり、アプライアンス メソッドはある種のデリゲートになります。次に、UI で、アプライアンス アクションをセンサーにフックするコードは、aSensor.actions += anAppliance.aMethod;これが Java に変換されるかどうか、またはどのように変換されるかは覚えていませんが、方法があると確信しています。

于 2013-03-27T18:28:00.343 に答える