Maison > Questions et réponses > le corps du texte
我们的作业要写一个web
宠物医院管理系统,因为医生、客户等都包含浏览、添加、删除操作,所以对于service
层,我希望有个统一的接口以供servlet
中的类使用。
开始我是这样定义的:
public interface ServiceManager<T extends PetHospital> {
boolean addOne(T arg);
boolean deleteOne(int id);
List<T> list(int page);
}
这样删除和浏览都没有问题,但是addOne(T arg)
方法会造成在servlet
层的类需要创建Hippiater
等bean
层里面声明的类,感觉这样做好像不太符合分层的设计,但是对于医生、客户、宠物等不同对象需要的参数是不一样的,我该怎么设计addOne
方法来保证servlet
层调用时只需要传这些对象需要的参数,而不是这些对象。
可能描述的不清楚,再解释一下:
我希望在接口里还是要声明addOne
方法,但是能够接收不同参数(个数、类型都不一定),这样在service
层还是可以优雅的实现这个接口。
对象及其属性包含的内容如下:
package bean;
//兽医
class Hippiater {
private int id;//primary key
private String name;//姓名
private int workAge;//医龄
private String speciality;//技能专长
}
//客户
class Customer {
private int id;//primary key
private String name;//姓名
}
//宠物
class Pet {
private int id; //primary key
private int masterId; //所属客户id
private String breed; //品种
private String name; //名字
}
//病历
class Record {
private int id; //primary key
private int petId; //宠物ID
private long recordTime; //病历创建日期
private String diseaseDescribe; //病情描述
}
目录结构如下:
root
+- bean
+- DAO
+- service
`- web
上面的几个类在bean
目录下,ServiceManager
接口位于service
目录下,为web
目录下的类提供服务。
但我觉得应该不能让web
下的类去操作bean
目录下的类的实例,而应该提供其所需参数,交给service
去处理
所有我的问题就是怎么设计我的ServiceManager
接口来满足这个需求
高洛峰2017-04-17 17:51:13
Laissez-moi d'abord vous poser quelques questions
Vous héritez de PetHospital en utilisant un paramètre de type T. Le type de T peut être Hippiater, Customer, Pet, etc. Cette méthode d'héritage viole la sémantique « est-A » de l'héritage. Imaginez qu'un client ou un animal de compagnie soit un PetHospital ?
Bien sûr, le Web peut comprendre les objets de la couche bean, car les paramètres de votre couche Web proviennent généralement du formulaire, vous devez donc naturellement savoir à quel objet est destiné le formulaire. Les contrôleurs en struts ou spring sont utilisés directement et encapsulent les paramètres de formulaire dans des objets de couche bean.
La méthode delete n'accepte qu'un identifiant, alors comment savoir quel objet doit être supprimé ? Est-ce un client ? Ou un animal de compagnie ? Et si ces deux-là avaient le même identifiant ?
Si vous devez utiliser des génériques, référez-vous au code suivant
public class Entity {
private String id;
//omit getter and setter
}
public class Pet extends Entity{
private String name;
}
public interface EntitiyService<T extends Entity> {
boolean addOne(T arg);
boolean deleteOne(int id);
List<T> list(int page);
}
public class EntityServiceImpl<T extends Entity> implements EntitiyService<T> {
@Override
public boolean addOne(T arg) {
System.out.println("save entity " + arg.toString());
return true;
}
@Override
public boolean deleteOne(int id) {
System.out.println("delete entity which type is T");
return false;
}
@Override
public List<T> list(int page) {
System.out.println("query first " + page + " pages result");
return null;
}
}
public class Client {
public static void main(String[] args) {
Pet petFromForm = new Pet();
EntityServiceImpl<Pet> entityService = new EntityServiceImpl<>();
entityService.addOne(petFromForm);
entityService.deleteOne(1);
entityService.list(3);
}
}