欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Annotation整合工厂设计模式和代理设计模式

程序员文章站 2024-01-20 17:25:58
...

使用Annotation进行开发的最大特点是可以将相应的配置信息写入Annotation后,在项目启动时通过反射获取相应的Annotation定义进行操作.

public interface IMessage {
    public void send(String msg);
}
public class CloudMessageImpl implements IMessage {
    @Override
    public void send(String msg) {
        System.out.println("[云消息发送]"+msg);
    }
}
public class NetMessageImpl implements IMessage {
    @Override
    public void send(String msg) {
        System.out.println("[网络消息发送]"+msg);
    }
}
public class MessageProxy implements InvocationHandler {
    private Object target;

    /**
     * 对象绑定
     * @param target
     * @return
     */
    public Object bind(Object target){
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    public boolean connect(){
        System.out.println("[代理操作]进行消息发送通道链接");
        return true;
    }

    public void close(){
        System.out.println("[代理操作]关闭链接通道");
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        try{
            if (this.connect()){
                return method.invoke(this.target,args);     //代理调用
            }else {
                throw new Exception("[ERROR] 消息无法进行发送");
            }
        }finally{
            this.close();
        }
    }
}
public class Factory {
    private Factory(){}
    public static <T> T getInstance(Class<T> clazz){        //返回实例化对象
        //利用反射获取实例化对象
        try{
            return (T) new MessageProxy().bind(clazz.getDeclaredConstructor().newInstance());
        }catch(Exception e){
            return null;
        }
    }
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface UserMessage {
    public Class<?> clazz();
}
@UserMessage(clazz= CloudMessageImpl.class)       //代理的对象
public class MessageService {
    private IMessage iMessage;

    /**
     * 通过Annotation获取
     */
    public MessageService(){
        UserMessage user = MessageService.class.getAnnotation(UserMessage.class);
        this.iMessage=(IMessage)Factory.getInstance(user.clazz());
    }

    public void send(String msg){
        this.iMessage.send(msg);
    }
}
package com.cn;

/**
 * @Authro: QYF
 * @Time:2020/9/12 22:20
 */
public class JacaReflectDemo {
    public static void main(String[] args) {
        //实例化接口对象
        MessageService messageService = new MessageService();
        //调用方法
        messageService.send("今天又是充满希望的一天");
    }
}

工厂设计模式和代理设计模式结婚在一起,这样可以实现真实业务与代理业务的分割;同时利用工厂类对外隐藏了代理类的操作细节,这样的整合更加符合实际项目开发结构;

MessageService类要调用IMessage接口提供的send()方法,所以在MessageService类定义上使用了自定义注解,以确定要使用的Imessage接口类,如果要进行子类更换,则直接修改注解定义即可.

相关标签: 设计模式 java