java创建用于查看和编辑的对象 问题

java创建用于查看和编辑的对象 问题,java,architecture,Java,Architecture,我正在构建我的类,因此类的所有者可以编辑信息,但是另一个只想从第一个类获取数据的类必须只查看数据,而不是编辑数据 例子 我有一个类餐厅,它包含餐厅的数据,如名称,优惠,食品,拥有餐厅的人可以从餐厅类中创建新对象并编辑其信息 客户可以从餐厅制作对象,但我希望他只是查看该餐厅的数据,而不是编辑数据 我试过的 创建餐厅的构造函数是私有的,但这意味着餐厅和客户都不能创建餐厅类的对象 要使餐厅的构造函数使用用户名和密码,在这种情况下,客户将无法创建新的餐厅对象 我应该用什么方法来解决我的问题?我的类应

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

例子 我有一个类
餐厅
,它包含餐厅的数据,如
名称
优惠
食品
,拥有餐厅的人可以从餐厅类中创建新对象并编辑其信息

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

我试过的
  • 创建餐厅的构造函数是私有的,但这意味着餐厅和客户都不能创建餐厅类的对象

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

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

任何帮助都将不胜感激

编辑 也许是设计模式的问题?我不知道

编辑2 在第一个答案之后,我得到了这个
此问题的典型解决方案是使用2个接口。对于
read
操作,我们称它们为
resourantdataretriever
,对于读/写操作,我们称它们为
resourantdataaccessor
,例如

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
,并将拥有对餐厅数据的完全访问权限。但是,另一个类将使用
resourantdataretriever
,并具有只读访问权限


这不是一个安全的解决方案。您无法避免有人从
resourantdataretriever
转换到
resourantdataaccessor
并使用全部功能。如果您需要安全的解决方案,请查看AspectJ或其他类似的解决方案

我根据@AlexR的答案创建了以下示例,希望这能有所帮助

Restaurant.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;
    }
}

@Alya'aGamal你读过这个问题吗?它不是问代码buddy,我不是要给我一个代码,我是要告诉我解决问题的方法,有点像我的类应该是什么,或者必须使用什么设计模式,我已经告诉过你我以为你需要一个代码的方法是什么,所以我问you@AlyaaGamal NoProblem buddy“我应该做什么?”可能更好地表述为“我应该使用什么方法来解决我的问题?我的类应该如何,或者必须使用什么设计模式?”我认为这是一个很好的问题,但为了编辑。谢谢你的回答。在您的解决方案中,我应该使用
getObject
方法来允许继承它的类从该接口检索对象吗?我的意思是,以您的方式,我现在不知道谁要创建新对象,而
customer
类应该做什么?我添加了一张照片,对吗?如果是,这些接口的实现在哪里