开发者学堂课程【Java 高级编程:工厂设计模式与 Annotation 整合】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/20/detail/398
工厂设计模式与 Annotation 整合
内容简介:
1.Annotation 操作
2.Annotation 操作特征
1.Annotation 操作
已经清楚 Annotation 的整体作用,但是 Annotation 到底在开发之中能做哪些事情呢?为了帮助大家进一步理解 Annotation 的处理目的,下面将结合工厂设计模式来应用 Annotation 操作。
(1).程序代码
1)package cn. mldn. demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
IMessage msg = Factory.getInstance(MessageImpl.class);
Msg.send(“www.mldn.cn”);
}
}
class Factory {
private Factory() {}
public static T getInstance(Class clazz) { // 直接返回一个实例化对象
try {
return (T) new MessageProxy() .bind(clazz. getDeclaredConstructor().newInstance() );
} catch (Exception e) {
e. printstackTrace();
return null;
}
}
}
class MessageProxy implenents InvocationHandler {
private Object target ;
public Object bind(Object target) {
this.target=target ;
return Proxy . nenProxyInstance(target . getClass().getClassLoader(), target . getClass(). getInterfaces(),this); }
}
public boolean connect() {
System. out . printIn(" [代理操作]通行消息发送通道的连接。");
return true ;
}
public void close() {
System. out .printIn(" [代理操作]关闭连接通道。");
}
@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();
}
interface IMessage {
public void send(String msg) ;
}
class MessageImpl implements IMessage {
@Override
public void send(String msg) {
System. out. printIn(" [消息发送]”+ msg);
}
}
这个代码是基础的动态代理与 getInstance()的结合,调用了 send()方法。
代码就完成了,程序执行结果如下:
[代理操作]进行消息发送通道的连接。
[消息发送] www. mldn. cn
[代理操作]关闭连接通道。
2)以上代码发挥不出操作特色,更高级的代码如下:
public class JavaAPIDemo {
public static void main(String[ ] args) throws Exception {
MessageService messageService = new MessageService() ;
messageService. send( "www. mldn.cn");
}
}
class MessageService {
private IMessage message ;
public MessageService() {
this.message = Factory . getInstance (MessageImpl.class) ;
}
public void send(String msg) {
this . message. send(msg);
}
}
执行结果如下:
[代理操作]进行消息发送通道的连接。
[消息发送] www . mldn. cn
[代理操作]关闭连接通道。
3)以上是一个标准的工厂与动态代理结合的形式,但也可以按下面代码操作:
@Retention(RetentionPolicy . RUNTIME)
@interface UseMessage {
public Class clazz() ;
}
@UseMessage(clazz=MessageImpl.class ) // 利用Annotation实现了类的使用
class MessageService {
private IMessage message ;
public Messageservice() {
UseMessage use = Messageservice. Class. getAnnotation(UseHessage.class) ;
}
Classclazz=use.clazz();
this.message =Factory. getInstence(use.clazz()) ; //直接通过Annotation获取
Public void send(string msg) {
This.message. send(msg);
}
}
执行结果如下:
[代理操作]进行消息发送通道的连接。
[消息发送] Www. mldn. cn
[代理操作]关闭连接通道。
4)如果要想更换子类,部分程序代码如下:
class NetMessageImpl implements IMessage {
@Override
public void send(String msg) {
System. out. print1n(" [网络消息发送]”+ msg);
}
}
此时把 Annotation 更换就完成了:
@UseMessage(clazz=NetMessageImpl.class)
// 利用 Annotation 实现了类的使用
程序执行结果如下:
[代理操作]进行消息发送通道的连接。
[网貉消息发送] www. mldn. cn
[代理操作]关闭连接通道。
这样就成了网络消息发送。
2. Annotation 操作特征
由于 Annotation 的存在,所以对于面向接口的编程的配置处理将可以直接利用Annotation 的属性完成控制,从而使得整体代码变得简洁。