如何创建包装器以区分2个或更多独立Web服务应用程序

时间:2015-08-07 05:32:46

标签: java web-services design-patterns soap wrapper

我的Eclipse中有2个项目,实际上是两个独立的webservice(发布SOAP)应用程序。通常我会从2个项目中创建2个JAR文件,而我过去常常用来发布服务。两种应用都有相同的方法。 现在我必须在这两个提供变量的服务之上提供一个包装器来区分服务。

如果我尝试通过传递变量来访问方法,那么它应该调用适当的类的实现。

在下面的例子中,我将动物作为整数传递。如果动物是1,那么应该调用Cat类方法,如果是2那么Dog类方法必须响应。

Wrapper wrap = new Wrapper();
wrap.makeNoise(int animal);   // 1=Bow-Bow, 2=Meow-Meow

以下是两个不同的Webservice应用程序发布SOAP

class Cat(){
 public void makeNoise(){
  System.out.println("Meow-Meow");
 }
}

Cat.java

class Dog(){
 public void makeNoise(){
  System.out.println("Bow-Bow");
 }
}

Dog.java

请建议我如何实施此要求

3 个答案:

答案 0 :(得分:1)

您是否考虑过使用策略模式? 例如,您可以使用void方法声明Interface以启动服务。 接下来,您将在包装器中实现该接口,并且每个接口都将启动不同的Web服务,最后您可以使用某种类型的开关,或者如果运算符选择(使用int)哪个引用应该转换为接口引用。在if / switch操作之后,您可以使用该接口方法启动所选服务。例如:

公共类Test1 {

public interface IWebserviceWrapper {

    void startWebservice();
}

public class Cat implements IWebserviceWrapper {

    public void makeNoise() {
        System.out.println("Meow-Meow");
    }

    @Override
    public void startWebservice() {
        this.makeNoise();

    }
}

public class Dog implements IWebserviceWrapper {

    public void makeNoiseORAnythingElse() {
        System.out.println("Bow-Bow");
    }

    @Override
    public void startWebservice() {
        this.makeNoiseORAnythingElse();
    }

}

public Test1() {

}

public IWebserviceWrapper chooseAnimal(int chosenParam) {
    switch (chosenParam) {
        case 1:
            return new Dog();
        case 2:
            return new Cat();
        default:
            break;
    }
    return null;

}

public static void main(String[] args) {
    Test1 example = new Test1();
    int chosenService = 2;
    IWebserviceWrapper service = example.chooseAnimal(chosenService);
    service.startWebservice();
}

}

我希望这会对你有所帮助。关于这个主题还有很多,所以你应该尝试阅读更多有关设计模式的内容。

答案 1 :(得分:0)

拥有switchif else声明始终是对SOLID原则的OCP原则的威胁。因此,正如@Grzegor Mandela所说,通过动态绑定的过程,你可以有一个公共接口,客户端类可以通过它来调用所需的类,这是Invetsion Of Control模式的核心概念。

这种为一组底层类提供适配器的方式也与Adapter模式有一些相似之处。

然后你可以拥有一个工厂模式,比如简单的工厂,你可以将创建对象的逻辑移动到单独的类,或者抽象工厂模式,在这个模式中可以创建单独的类来实现每个类对象的实例化。

通过传递我们想要的webservice名称来使用反射创建对象可以使代码更具可扩展性。

答案 2 :(得分:0)

您可以使用工厂模式

public class ServiceFactory {
    public Service createService(int type) {
        return type == 1 ? new Dog() : new Cat();
    }
}

在对象实例化方面拥有条件逻辑是一个完全有效的地方。另外,摆脱"包装"术语。它不适用于此,因为您在任何时候都不使用装饰器。您可能希望使用术语"客户端"因为听起来你是几个网络服务的客户端。