web-dev-qa-db-ja.com

Javaでカップリングせずに別のオブジェクトからオブジェクトに通信しますか?

つまり、PersonオブジェクトとGumballMachineオブジェクトがあります。私が探している動作は、不必要な結合を回避する目的で、Personオブジェクト内からinsertCoin()メソッドを呼び出し、次にinsertCoin()を呼び出すことです。 GumballMachineGumballを受け取ります。

結合を回避し、これらの2つのオブジェクトの間に「ブリッジ」の種類がある間、これらの2つのオブジェクトを互いに気づかないようにする適切なデザインパターンまたはソリューションとは何ですか?

4
3alto

エリオットが言っていたことを拡大する。

コインが受け入れられた場合にtrueを返すインターフェース。

public interface Coinable {
    public boolean insertCoin();
}

Coinableインターフェースに挿入するコインを持っている人クラス。

public class Person {
    private int coins;

    public Person(int coins) {
        this.coins = coins;
    }

    public void insertCoin(Coinable cn) {
        if (this.coins <= 0) {
            System.out.println("You have no coins");
        } else {
            boolean coinAccepted = cn.insertCoin();
            if (coinAccepted) {
                coins--;
            }
        }
    }
}

そして、Coinableインターフェースを実装するGumballMachine。

class GumballMachine implements Coinable {
    private int gumBalls;

    public GumballMachine(int gumBalls) {
        this.gumBalls = gumBalls;
    }

    @Override
    public boolean insertCoin() {
        if (gumBalls <= 0) {
            System.out.println("There are no gumballs left");
            return false;
        } else {
            System.out.println("A gumball was dispensed!");
            gumBalls--;
            return true;
        }
    }
}

そして、これらすべてがどのように機能するかの例

public static void main(String[] args) {
    Person p = new Person(3); // 3 coins
    GumballMachine g = new GumballMachine(2); // 2 gumballs 

    p.insertCoin(g);
    p.insertCoin(g);
    p.insertCoin(g); // out of gumballs

    g = new GumballMachine(2); // refill the machine, still have 1 coin
    p.insertCoin(g);
    p.insertCoin(g);
}

出力

A gumball was dispensed!
A gumball was dispensed!
There are no gumballs left
A gumball was dispensed!
You have no coins
5
cricket_007

単一のinsertCoin()メソッドを使用して、インターフェース、たとえばCoinableを作成します。

interface Coinable {
    insertCoin();
}

次に、nを実装するObjectCoinable(s)を作成できます(そして、一部は delegate )。そして インターフェースへのプログラミング により、さまざまなインスタンスを交換して使用できます。

4
Elliott Frisch

さて、ここに質問の別の見方があります。

オブジェクト指向の原則は、結合を最小限に抑えることです。私はそれがしばしば良い考えであることに同意します。しかし、もう1つの重要なプログラミング原則は、複雑さを最小限に抑えることです。 cricket_007の答えはカップリングを減らすのに優れていますが、コードを追加しています。私はあなたのアプリケーションの詳細を知りませんが、よりシンプルだがより結合されたコードで行く方が良い場合があるかもしれません。これは、アプリケーションがかなり小さくなる場合に特に当てはまります。

0