0

问题

我正在构建我的课程,因此课程的所有者可以编辑信息,但另一个只想从第一堂课获取数据的班级必须只查看数据而不是编辑它。

例子

我有restaurant一个包含餐厅数据的类,如name, offers, foods,拥有餐厅的人可以从餐厅类中创建新对象并编辑他的信息。

客户可以从餐厅制作一个对象,但我希望他只是查看该餐厅的数据而不是对其进行编辑。

我试过的

  • 使餐厅的构造函数是私有的,但这意味着餐厅和顾客都不能创建餐厅类的对象。

  • 使餐厅的构造函数获取用户名和密码,在这种情况下,客户将无法创建新的餐厅对象。

我应该使用什么方法来解决我的问题?我的课程应该如何,或者必须使用什么设计模式?

任何帮助,将不胜感激。

编辑

也许这与设计模式有关?我不知道

编辑 2

在第一个答案之后,我得到了这个 在此处输入图像描述

4

2 回答 2

1

此问题的典型解决方案是使用 2 个接口。让我们称它们RestourantDataRetrieverread操作和RestourantDataAccessor读/写操作,例如

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并且将具有只读访问权限。

这不是安全的解决方案。您无法避免有人从RestourantDataRetrieverto 转换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 回答