Rumah > Soal Jawab > teks badan
我们的作业要写一个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
Biar saya beritahu anda beberapa soalan dahulu
Anda mewarisi PetHospital menggunakan parameter jenis T. Jenis T mungkin Hippiater, Pelanggan, Binatang, dsb. Kaedah pewarisan ini melanggar semantik pewarisan "is-A" Bayangkan bahawa pelanggan atau haiwan peliharaan adalah PetHospital?
Sudah tentu web boleh memahami objek dalam lapisan kacang, kerana parameter lapisan web anda biasanya datang dari bentuk, jadi secara semula jadi anda mesti tahu untuk objek apa bentuk itu. Pengawal dalam tupang atau spring digunakan secara langsung dan merangkum parameter bentuk ke dalam objek lapisan kacang.
Kaedah padam hanya menerima id, jadi bagaimana anda tahu objek apa yang perlu dipadamkan? Adakah ia pelanggan? Atau haiwan peliharaan? Bagaimana jika kedua-duanya mempunyai id yang sama?
Jika anda mesti menggunakan generik, rujuk kod berikut
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);
}
}