一个接口可能有多种实现
其实现类由spring 管理
现在要根据某种(一种或者几种)规则定义来找到该接口其中的一个接口实现
请各位指教该如何来设计 

解决方案 »

  1.   

    接口 A 有两个实现类
    A1 A2 
    我现在要根据一个规则 这个规则是不确定
    比如
    我现在要让用户为1001的找到 A1
    让用户为1002的找到A2或者 我要让学生找到A1
    让老师找到A2
      

  2.   

    A1 与A2 是接口A的不同实现
      

  3.   

    目前我见的spring都是一个接口对应一个实现方法,可以根据配置文件配不同的实现方法,但是一次只能配一个。
    能否配多个实现方法并按条件取就不知道了,spring我仅限于表面理解。
      

  4.   

    不要把规则 确定在用户上面,我或许根据时间段来选择A1 或者A2 
    12:00-1:00 客户端给我一个接口 我直接去找A1
    3:00-4:00 客户端给我一个接口 我直接去找A2
      

  5.   

    Java里好像还真没有一个概念去对应你所说的“找到”哦...其实我理解你找到就是创建一个类的实例并且执行一些方法那你就引入你的规则 然后用变量去控制分支呗  
      

  6.   

    可以用反射机制写一个工厂方法,根据条件动态的获取运行时类型。
    spring应该有这个功能,不过我没配过,不知道配置文件怎么配。而且spring的xml配置文件是模式XML不是DTD的,eclipse没法判断该xml文件怎么写,没法猜着写配置文件。你到谷歌上搜一下spring配置文件的学习资料吧
      

  7.   

    呵呵,可能我的没有说明白我的意思
    是这样的:我想对于client的调用 每次只需要给我一个接口名A  ,我会根据某些规则 来自动从spring 中获取接口A的实现 A1 或者B1 并返回A1或者B1现在这些规则的做用域我不清楚该怎么定义现在我的做法是 有一张接口路由表
    需要路由的接口都在路口路由表中注册,
    结构为
    <config>
    <interface id="A"  >
    <class className ="A1" springbeanid=""  ***/>
    <class className="A2" springbeanid="" *** />
    </interface>
    </config>
    ***为一些其他的属性。。
    现在我应该怎么定义规则 的作用呢。。我要的是一种设计 的思路。。希望大家能改些建议。。分不够开新贴在加谢谢了
      

  8.   

    规则太复杂就不要再采用一接口多实现的形式了,接口实现的功能不确定,已经违背了使用接口的初衷。
    根据规则的不同取不同的处理方法,建议采用类似struts的DispatchAction的处理。
      

  9.   

    对于外部调用来说我不用接口用什么呢?
    “根据规则的不同取不同的处理方法,建议采用类似struts的DispatchAction的处理。” 这样的东西还能代码利用吗?
      

  10.   

    给你一个思路吧,Spring我不是太精通,这个是OSGI里的做法,不知道在Spirng里能不能实现:
    我们假设A为调用类:在接口中定义一个方法,这个方法返回的是每个实现类的ID。
    实现类起动时,采用注册机制,将自己注册到A中,A有个map实现规则与实现类的对应关系。这样,调用时只要根据规则从map中取出相应的实例就可以了。
    部分代码如下:
    private Hashtable table = new Hashtable(); public void registerHandler(IRequestHandler hd) {
    table.put(hd.getId(), hd);

    } public void unregisterHandler(IRequestHandler hd) {
    table.remove(hd.getId());
    }
      

  11.   

    谢谢楼上的 现在的问题不是如何通过接口去找到实际要调用的类,而是根据规则选择我的要调用的类
    我现在不能定位如何在找到那个类之前应用的我规则。。
    还有这个问题与spring或者struts 之类的东西毫无关第。。
    so 你的思路是用不了的不过还是谢谢期待ing强调 我的要的一种思路
      

  12.   

    实现类可以持有该用户的引用或者id也行,当有新用户时,可以运用观察者模式使相应的接口
    的实现拥有该对象的引用或者id
      

  13.   


    呵呵。。你想的太简单了。。我说了不用把规则限定在用户上面。。我有可能是一个时间范围段 也可能是两者的组合。。在说了我的实现类A1 A2 上也不需要多于的属性。。所以试图判断某个属性的值发生变化运用obvser的方式 是行不通的
      

  14.   

    在说一次的我的需求吧:现在有一个接口 A 
    接口A有两个实现 分别为classA classB现在客户端提交给服务器一个请求 并传给我一个接口名 A 给服务器服务器根据配置知道接口A 有两个实现 为classA classB 现在我自己做了一个路由器,这个路由有一个或者几个 或者 没有规则 如果有规则 就根据这个规则 到由到我需要的class 比如说 
    我现在的规则是根据不同的用户路由到不同的类(请不要把规则确定在用户上)
    如果是张三 我就路由到classB
    如果是李四 我就路由到classA现在这个规则 的类我应该如何定义 ,如何是灵活 轻便 的引入这些规则
      

  15.   

    还是不太明白楼主的意思啊:
    不知道是不是这个意思,可以通过一个配置文件,里面存放规则的集合(或自己定义规则吧),每个集合对应一个类(类的全称),只要规则与anme能对上,可以通过class.forName(name).newinstance()来动态加裁。
      

  16.   

    我就是用配置文件来定义这些规则的结果让我头给 否定了。。不够灵活问题是怎么在路由的时候运用这些规则  (这个规则一定是一个calss)楼上的基本上用那么一定意思
     
    每个 接口应该有一个特定的选择器 ,通过这个选择器这定义的规则找到我要实现的类
      

  17.   

    不明白你的领导是怎么想的,配置文件还不灵活?灵活是要有一定的限度的,否则做的很复杂啊。他是不是这意思:接口是用来配置规则,可以这样理解:输入规则,输出className。但是这样的问题是当你有个新的规则来的时候,不仅要写一个接口的实现类来解析规则,还要写一个处理类来处理。工作量变大了,所以这块要衡量一下。
      

  18.   


    《Interface》
        |
        |
        V
       [ ]
      抽像类(实现接口)<-----规则处理抽像类.
                                |
        |                       |
        |                       |
        V                       V
     多个实现类                 多个实现类
      

  19.   

    我现在做的项目和楼主的要求很类似。不过我们用的是Spring DM来管理osgi服务。也是一个接口有好几个类来实现。这样从客户端有请求时,那个请求会面对几个服务(implemnt同样的interface)。我们的做法是在interface里定义一个方法,例如public String supportedRule(),如果这哪个类的这个方法返回值和规则相等,就用哪个类。