Annotation整合工厂设计模式

Posted 逍遥天地间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Annotation整合工厂设计模式相关的知识,希望对你有一定的参考价值。

Annotation 是为了提供配置处理操作的,这些配置可以通过反射实现,本课程主要讲解 Annotation 与工厂设计模式的整合处理操作。

 

代码如下:

package com.anno.demo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface IMessage{                //业务接口
    public void send(String msg);    //输出业务
}

class CloudMessageImpl implements IMessage{        //业务接口实现子类
    @Override
    public void send(String msg) {                //方法覆写
        System.out.println("【云消息发送】" + msg);
    }
}

class NetMessageImpl implements IMessage{    //业务接口实现子类
    @Override
    public void send(String msg) {            //方法覆写
        System.out.println("【网络消息发送】" + msg);
    }
}

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;
        }
    }
}

class MessageProxy implements InvocationHandler{    //代理类
    private Object target;
    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();
        }
    }
}

@Target({ElementType.TYPE, ElementType.METHOD})        //只能用在类和方法上
@Retention(RetentionPolicy.RUNTIME)
@interface UseMessage{
    public Class<?> clazz();    //定义要使用的类型
}
@UseMessage(clazz = CloudMessageImpl.class)    //Annotation定义使用类。红色部分可以修改为其他实现类,实现调用不同类输出。

class MessageService{
    private IMessage message;        //定义业务处理
    public MessageService() {
        UseMessage use = MessageService.class.getAnnotation(UseMessage.class);
        this.message = (IMessage) Factory.getInstance(use.clazz());    //通过Annotation获取
    }
    public void send(String msg) {
        this.message.send(msg);
    }
}

public class Anno {
    public static void main(String[] args) {
        MessageService messageService = new MessageService();    //实例化接口对象
        messageService.send("www.sina.com.cn");    //调用方法
    }
}

运行结果:

【代理操作】进行消息发送通道的连接.
【云消息发送】www.sina.com.cn
【代理操作】关闭连接通道.

 

以上是关于Annotation整合工厂设计模式的主要内容,如果未能解决你的问题,请参考以下文章

完整案例分析再加知识整合——艾特工厂方法模式,超详细的

完整案例分析再加知识整合——艾特简单工厂模式,超详细的

SpringBoot整合Mybatis之Annotation

完整案例分析再加知识整合——艾特抽象工厂模式,超详细的

PHP面向对象之选择工厂和更新工厂

基本设计模式06- 一般工厂模式