0

問題

私は自分のクラスを作成しているので、クラスの所有者は情報を編集できますが、最初のクラスからデータを取得したいだけの別のクラスは、データを編集するのではなく表示する必要があります。

、、のrestaurantようなレストランのデータを含むクラスがあります。レストランを持っている人は、レストラン クラスから新しいオブジェクトを作成し、自分の情報を編集できます。nameoffersfoods

顧客はレストランからオブジェクトを作成できますが、編集ではなくそのレストランのデータを確認するだけにしてほしいです。

私が試したこと

  • レストランのコンストラクターをプライベートにしますが、これはレストランも顧客もレストラン クラスのオブジェクトを作成できないことを意味します。

  • レストランのコンストラクターにユーザー名とパスワードを取得させます。この場合、顧客は新しいレストラン オブジェクトを作成できません。

問題を解決するには、どのアプローチを使用する必要がありますか? 私のクラスはどうあるべきか、またはどのデザインパターンを使用する必要がありますか?

どんな助けでも大歓迎です。

編集

多分それはデザインパターンに関するものですか?知らない

編集 2

最初の答えの後、私はこれを得ました ここに画像の説明を入力

4

2 に答える 2

1

この問題の一般的な解決策は、2 つのインターフェイスを使用することです。操作と読み取り/書き込み操作のためにそれらRestourantDataRetrieverを呼び出しましょう。readRestourantDataAccessor

interface RestourantDataRetriever {
    String getName();
    Person getCheif();
    Address getAddress();
}

interface RestourantDataAccessor extends RestourantDataRetriever {
    void setName(String name);
    void setCheif(Person chief);
    Address setAddress(Address address);
}

アクセサがレトリバーを拡張して、データも取得できるようにすることに注意してください。

これで、所有者はRestourantDataAccessorレストランのデータに完全にアクセスできるようになります。ただし、他のクラスはRestourantDataRetriever読み取り専用アクセスで動作します。

これは安全なソリューションではありません。RestourantDataRetrieverキャストしてRestourantDataAccessor完全な機能を使用する誰かを避けることはできません。安全なソリューションが必要な場合は、AspectJ または他の同様のソリューションを検討してください。

于 2013-04-28T08:43:40.797 に答える
0

@AlexR の回答に基づいて次の例を作成しました。

レストラン.java:

package org.example;

public interface Restaurant {

    String getName();

    Person getChief();

    Address getAddress();

}

RestaurantImpl.java:

package org.example;

public class RestaurantImpl implements Restaurant {

    private String name;
    private Person chief;
    private Address address;

    public RestaurantImpl(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person getChief() {
        return chief;
    }

    public void setChief(Person chief) {
        this.chief = chief;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

}

RestaurantService.java:

package org.example;

public class RestaurantService {

    public static void main(String[] args) {

        Restaurant restaurant = getRestaurant();

        // only the Getters are available
        String name = restaurant.getName();
        Address address = restaurant.getAddress();
        Person chief = restaurant.getChief();

        // This can not be avoided easily
        if (restaurant instanceof RestaurantImpl) {
            RestaurantImpl modifiableRestaurant = (RestaurantImpl) restaurant;
            modifiableRestaurant.setName(name);
            modifiableRestaurant.setAddress(address);
            modifiableRestaurant.setChief(chief);
        }

    }

    private static Restaurant getRestaurant() {
        RestaurantImpl restaurant = new RestaurantImpl("My Restaurant Name");
        restaurant.setAddress(new Address());
        restaurant.setChief(new Person());
        return restaurant;
    }
}
于 2013-04-28T10:46:48.613 に答える