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

我们的作业要写一个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层的类需要创建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接口来满足这个需求

大家讲道理
大家讲道理

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

全部回覆(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<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);
    }
}
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板