服务器定位模式——配合注解实现

来源:互联网 发布:微信公众平台asp源码 编辑:程序博客网 时间:2024/05/22 18:55

服务器定位模式——配合注解实现

本文主要介绍如何使用注解实现服务器定位模式。
本文主要参考:http://www.runoob.com/design-pattern/service-locator-pattern.html

服务器定位模式的使用场景:当有多个服务实现类需要根据需要进行分别调用时使用。


我们在使用CalServiceImpl2和CalServiceImpl1时,正常情况下会使用这样的方式。
CalService calService = new CalServiceImpl1();
CalService calService = new CalServiceImpl2();

现在要说的是使用服务器定位模式来实现调用。
下面是使用服务器定位模式的类图:


具体实现:
package com.xueyou.demo.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Provider {    String value() default "";}


package com.xueyou.demo.locator;import com.xueyou.demo.service.CalService;import com.xueyou.demo.serviceImpl.CalServiceImpl1;import com.xueyou.demo.serviceImpl.CalServiceImpl2;public class CalServiceLocator {    private static CalServiceLocator calServiceLocator;    private CalServiceLocator() {    }    public static CalServiceLocator getInstance() {        if (calServiceLocator != null) {            return calServiceLocator;        }        return new CalServiceLocator();    }    public CalService getService(String serviceName) {        CalService calService;        if (serviceName.equals("serviceImpl1")) {            calService = new CalServiceImpl1();        } else if (serviceName.equals("serviceImpl2")) {            calService = new CalServiceImpl2();        } else {            calService = null;        }        return calService;    }}

package com.xueyou.demo.locator;import com.xueyou.demo.service.CalService;import com.xueyou.demo.serviceImpl.CalServiceImpl1;import com.xueyou.demo.serviceImpl.CalServiceImpl2;import com.xueyou.demo.serviceImpl.DefaultCalServiceImpl;import sun.security.jca.GetInstance;import java.util.HashMap;import java.util.Map;public class CalServiceLocator2 {    private static CalServiceLocator2 calServiceLocator2;    private static Map<String, CalService> map = new HashMap<>();    private CalServiceLocator2() {    }    public static CalServiceLocator2 getInstance() {        if (calServiceLocator2 != null) {            return calServiceLocator2;        }        calServiceLocator2 = new CalServiceLocator2();        return calServiceLocator2;    }    public void register(String code, CalService calService) {        if (!map.containsKey(code)) {            map.put(code, calService);        }    }    public CalService getService(String code) {        if (map.containsKey(code)) {            return map.get(code);        }        return null;    }    public void showCache() {        System.out.println("cache 情况 --begin");        for (String s : map.keySet()) {            System.out.println(s + ":" + map.get(s));        }        System.out.println("cache 情况 --end");    }    public void init(){        new DefaultCalServiceImpl();        new CalServiceImpl1();        new CalServiceImpl2();        System.out.println("service init ......");    }}

package com.xueyou.demo.service;public interface CalService {    public void say();}


package com.xueyou.demo.serviceImpl;import com.xueyou.demo.annotation.Provider;import com.xueyou.demo.locator.CalServiceLocator2;import com.xueyou.demo.service.CalService;@Provider("default")public class DefaultCalServiceImpl implements CalService {    public DefaultCalServiceImpl() {        Provider provider = this.getClass().getAnnotation(Provider.class);        String code = provider.value();        CalServiceLocator2.getInstance().register(code, this);    }    @Override    public void say() {        System.out.println(this);        System.out.println("this is " + this.getClass().getName());    }}


package com.xueyou.demo.serviceImpl;import com.xueyou.demo.annotation.Provider;@Provider(value = "service1")public class CalServiceImpl1 extends DefaultCalServiceImpl {    @Override    public void say() {        System.out.println(this);        System.out.println("this is " + this.getClass().getName());    }}


package com.xueyou.demo.serviceImpl;import com.xueyou.demo.annotation.Provider;@Provider("service2")public class CalServiceImpl2 extends DefaultCalServiceImpl{    @Override    public void say() {        System.out.println(this);        System.out.println("this is " + this.getClass().getName());    }}

package com.xueyou.demo;import com.xueyou.demo.annotation.Provider;import com.xueyou.demo.locator.CalServiceLocator;import com.xueyou.demo.locator.CalServiceLocator2;import com.xueyou.demo.service.CalService;import com.xueyou.demo.serviceImpl.CalServiceImpl1;import com.xueyou.demo.serviceImpl.CalServiceImpl2;import com.xueyou.demo.serviceImpl.DefaultCalServiceImpl;import java.lang.reflect.Field;/** * Hello world! */public class App {    public static void main(String[] args) {        CalServiceLocator2 serviceLocator2 = CalServiceLocator2.getInstance();        serviceLocator2.showCache();        serviceLocator2.init();        serviceLocator2.showCache();        CalService calService = serviceLocator2.getService("service1");        calService.say();        CalService calService1 = serviceLocator2.getService("service2");        calService1.say();    }}


运行结果:

原创粉丝点击