我正在构建我的类,所以类的所有者可以编辑信息,但另一个只想从第一个类获取数据的类必须只查看数据而不是编辑它。
我的课程restaurant
包含餐馆的数据,例如name
,offers
,foods
,有餐厅的人可以从餐厅制作新物品上课并编辑他的信息。
顾客可以从餐厅制作一个物品,但我希望他只是查看该餐馆的数据而不是编辑它。
使餐厅的构造者是私人的,但这意味着餐厅和顾客都不能成为餐厅的对象。
使餐馆的构造函数采用用户名和密码,在这种情况下,客户将无法创建新的餐馆对象。
我应该用什么方法来解决我的问题?我的课程应该如何,或者必须使用什么设计模式?
任何帮助都将不胜感激。
也许它与设计模式有关?我不知道
答案 0 :(得分:1)
此问题的典型解决方案是使用2个接口。我们为RestourantDataRetriever
操作调用read
,为读/写操作调用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
一起使用,并且只具有只读访问权限。
这不是安全的解决方案。您无法避免有人从RestourantDataRetriever
投射到RestourantDataAccessor
并使用完整功能。如果您需要安全的解决方案,请查看AspectJ或其他类似的解决方案。
答案 1 :(得分:0)
我根据@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;
}
}