java 接口中如何声明类似于重载的方法?
大家讲道理
大家讲道理 2017-04-17 17:49:13
0
1
462

我们的作业要写一个web宠物医院管理系统,因为医生、客户等都包含浏览、添加、删除操作,所以对于service层,我希望有个统一的接口以供servlet中的类使用。

开始我是这样定义的:

public interface ServiceManager { boolean addOne(T arg); boolean deleteOne(int id); List list(int page); }

这样删除和浏览都没有问题,但是addOne(T arg)方法会造成在servlet层的类需要创建Hippiaterbean层里面声明的类,感觉这样做好像不太符合分层的设计,但是对于医生、客户、宠物等不同对象需要的参数是不一样的,我该怎么设计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接口来满足这个需求

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

répondre à tous (1)
小葫芦

先说一下你的几个问题

  1. 你使用一个类型参数T继承PetHospital,T的类型可能是Hippiater,Customer,Pet等。这种继承方法违反了继承的“is-A”语义,试想一下一个customer或者一个pet是一个PetHospital吗?

  2. web曾当然可以了解bean层的对象,因为你web层的参数一般是来自于表单,那自然必须知道这个表单是为了添加什么对象的。在struts或者spring中的controller都是直接使用并且把form参数封装成bean层的对象的。

  3. delete方法只接受一个id,那怎么知道需要删除的是什么对象?是一个customer?还是一个pet?如果这两者有相同的id?

如果一定要用范型,参考下面代码

public class Entity { private String id; //omit getter and setter } public class Pet extends Entity{ private String name; } public interface EntitiyService { boolean addOne(T arg); boolean deleteOne(int id); List list(int page); } public class EntityServiceImpl implements EntitiyService { @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 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 entityService = new EntityServiceImpl<>(); entityService.addOne(petFromForm); entityService.deleteOne(1); entityService.list(3); } }
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!