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