天天看點

工廠設計模式與 Annotation 整合|學習筆記

開發者學堂課程【Java 進階程式設計:工廠設計模式與 Annotation 整合】學習筆記,與課程緊密聯系,讓使用者快速學習知識。

課程位址:

https://developer.aliyun.com/learning/course/20/detail/398

工廠設計模式與 Annotation 整合

内容簡介:

1.Annotation 操作

2.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> T getInstance(Class<T> 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) ;

}

    Class<?>clazz=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 的屬性完成控制,進而使得整體代碼變得簡潔。