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接口类,如果要进行子类更换,则直接修改注解定义即可.
上一篇: (数字操作类)Math数字计算类
下一篇: 注解(Annotation)与反射