JAVA的靜態(tài)代理與動態(tài)代理比較
創(chuàng)新互聯(lián)公司是專業(yè)的蘆淞網(wǎng)站建設(shè)公司,蘆淞接單;提供網(wǎng)站制作、成都做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行蘆淞網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
一、概念
代理模式是常用的Java 設(shè)計模式,它的特征是代理類與委托類有同樣的接口,代理類主要負(fù)責(zé)為委托類預(yù)處理消息、過濾消息、把消息轉(zhuǎn)發(fā)給委托類,以及事后處理消息等。代理類與委托類之間通常會存在關(guān)聯(lián)關(guān)系,一個代理類的對象與一個委托類的對象關(guān)聯(lián),代理類的對象本身并不真正實(shí)現(xiàn)服務(wù),而是通過調(diào)用委托類的對象的相關(guān)方法,來提供特定的服務(wù)。按照代理類的創(chuàng)建時期,代理類可分為兩種。
靜態(tài)代理類:
由程序員創(chuàng)建或由特定工具自動生成源代碼,再對其編譯。在程序運(yùn)行前,代理類的.class文件就已經(jīng)存在了。動態(tài)代理類:在程序運(yùn)行時,運(yùn)用反射機(jī)制動態(tài)創(chuàng)建而成。
二、靜態(tài)代理類
如下, HelloServiceProxy 類是代理類,HelloServiceImpl類是委托類,這兩個類都實(shí)現(xiàn)了HelloService接口。其中HelloServiceImpl類是HelloService接口的真正實(shí)現(xiàn)者,而HelloServiceProxy類是通過調(diào)用HelloServiceImpl 類的相關(guān)方法來提供特定服務(wù)的。HelloServiceProxy類的echo()方法和getTime()方法會分別調(diào)用被代理的HelloServiceImpl 對象的echo()方法和getTime()方法,并且在方法調(diào)用前后都會執(zhí)行一些簡單的打印操作。
由此可見,代理類可以為委托類預(yù)處理消息、把消息轉(zhuǎn)發(fā)給委托類和事后處理消息等。
例程1 HelloService.java
package proxy;
import java.util.Date;
public interface HelloService{
public String echo(String msg);
public Date getTime();
}
例程2 HelloServiceImpl.java
package proxy;
import java.util.Date;
public class HelloServiceImpl implements HelloService{
public String echo(String msg){
return "echo:"+msg;
}
public Date getTime(){
return new Date();
}
}
例程3 HelloServiceProxy.java
package proxy;
import java.util.Date;
public class HelloServiceProxy implements HelloService{
private HelloService helloService; //表示被代理的HelloService 實(shí)例
public HelloServiceProxy(HelloService helloService){
this.helloService=helloService;
}
public void setHelloServiceProxy(HelloService helloService){
this.helloService=helloService;
}
public String echo(String msg){
System.out.println("before calling echo()"); //預(yù)處理
String result=helloService.echo(msg); //調(diào)用被代理的HelloService 實(shí)例的echo()方法
System.out.println("after calling echo()"); //事后處理
return result;
}
public Date getTime(){
System.out.println("before calling getTime()"); //預(yù)處理
Date date=helloService.getTime(); //調(diào)用被代理的HelloService 實(shí)例的getTime()方法
System.out.println("after calling getTime()"); //事后處理
return date;
}
}
在Client1 類的main()方法中,先創(chuàng)建了一個HelloServiceImpl對象,又創(chuàng)建了一個HelloServiceProxy對象,最后調(diào)用HelloServiceProxy對象的echo()方法。
例程4 Client1.java
package proxy;
public class Client1{
public static void main(String args[]){
HelloService helloService=new HelloServiceImpl();
HelloService helloServiceProxy=new HelloServiceProxy(helloService);
System.out.println(helloServiceProxy.echo("hello"));
}
}
運(yùn)行Client1 類,打印結(jié)果如下:
before calling echo()
after calling echo()
echo:hello
例程3 的HelloServiceProxy 類的源代碼是由程序員編寫的,在程序運(yùn)行前,它的.class文件就已經(jīng)存在了,這種代理類稱為靜態(tài)代理類。
三、動態(tài)代理類
與靜態(tài)代理類對照的是動態(tài)代理類,動態(tài)代理類的字節(jié)碼在程序運(yùn)行時由Java反射機(jī)制動態(tài)生成,無需程序員手工編寫它的源代碼。動態(tài)代理類不僅簡化了編程工作,而且提高了軟件系統(tǒng)的可擴(kuò)展性,因?yàn)镴ava 反射機(jī)制可以生成任意類型的動態(tài)代理類。java.lang.reflect 包中的Proxy類和InvocationHandler 接口提供了生成動態(tài)代理類的能力。
Proxy類提供了創(chuàng)建動態(tài)代理類及其實(shí)例的靜態(tài)方法。
(1)getProxyClass()靜態(tài)方法負(fù)責(zé)創(chuàng)建動態(tài)代理類,它的完整定義如下:
public static Class getProxyClass(ClassLoader loader, Class[] interfaces) throws IllegalArgumentException
參數(shù)loader 指定動態(tài)代理類的類加載器,參數(shù)interfaces 指定動態(tài)代理類需要實(shí)現(xiàn)的所有接口。
(2)newProxyInstance()靜態(tài)方法負(fù)責(zé)創(chuàng)建動態(tài)代理類的實(shí)例,它的完整定義如下:
public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler handler) throws
IllegalArgumentException
參數(shù)loader 指定動態(tài)代理類的類加載器,參數(shù)interfaces 指定動態(tài)代理類需要實(shí)現(xiàn)的所有接口,參數(shù)handler 指定與動態(tài)代理類關(guān)聯(lián)的 InvocationHandler 對象。
以下兩種方式都創(chuàng)建了實(shí)現(xiàn)Foo接口的動態(tài)代理類的實(shí)例:
/**** 方式一 ****/
//創(chuàng)建InvocationHandler對象
InvocationHandler handler = new MyInvocationHandler(...);
//創(chuàng)建動態(tài)代理類
Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new Class[] { Foo.class });
//創(chuàng)建動態(tài)代理類的實(shí)例
Foo foo = (Foo) proxyClass.getConstructor(new Class[] { InvocationHandler.class }).
newInstance(new Object[] { handler });
/**** 方式二 ****/
//創(chuàng)建InvocationHandler對象
InvocationHandler handler = new MyInvocationHandler(...);
//直接創(chuàng)建動態(tài)代理類的實(shí)例
Foo foo = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[] { Foo.class }, handler);
由Proxy類的靜態(tài)方法創(chuàng)建的動態(tài)代理類具有以下特點(diǎn):
動態(tài)代理類是public、final和非抽象類型的;
動態(tài)代理類繼承了java.lang.reflect.Proxy類;
動態(tài)代理類的名字以“$Proxy”開頭;
動態(tài)代理類實(shí)現(xiàn)getProxyClass()和newProxyInstance()方法中參數(shù)interfaces指定的所有接口;
Proxy 類的isProxyClass(Class cl)靜態(tài)方法可用來判斷參數(shù)指定的類是否為動態(tài)代理類。只有通過Proxy類創(chuàng)建的類才是動態(tài)代理類;
動態(tài)代理類都具有一個public 類型的構(gòu)造方法,該構(gòu)造方法有一個InvocationHandler 類型的參數(shù)。
由Proxy類的靜態(tài)方法創(chuàng)建的動態(tài)代理類的實(shí)例具有以下特點(diǎn):
1. 假定變量foo 是一個動態(tài)代理類的實(shí)例,并且這個動態(tài)代理類實(shí)現(xiàn)了Foo 接口,那么“foo instanceof Foo”的值為true。把變量foo強(qiáng)制轉(zhuǎn)換為Foo類型是合法的:
(Foo) foo //合法
2.每個動態(tài)代理類實(shí)例都和一個InvocationHandler 實(shí)例關(guān)聯(lián)。Proxy 類的getInvocationHandler(Object proxy)靜態(tài)方法返回與參數(shù)proxy指定的代理類實(shí)例所關(guān)聯(lián)的InvocationHandler 對象。
3.假定Foo接口有一個amethod()方法,那么當(dāng)程序調(diào)用動態(tài)代理類實(shí)例foo的amethod()方法時,該方法會調(diào)用與它關(guān)聯(lián)的InvocationHandler 對象的invoke()方法。
InvocationHandler 接口為方法調(diào)用接口,它聲明了負(fù)責(zé)調(diào)用任意一個方法的invoke()方法:
Object invoke(Object proxy,Method method,Object[] args) throws Throwable
參數(shù)proxy指定動態(tài)代理類實(shí)例,參數(shù)method指定被調(diào)用的方法,參數(shù)args 指定向被調(diào)用方法傳遞的參數(shù),invoke()方法的返回值表示被調(diào)用方法的返回值。
四、最后看一個實(shí)例:
HelloServiceProxyFactory 類的getHelloServiceProxy()靜態(tài)方法負(fù)責(zé)創(chuàng)建實(shí)現(xiàn)了HelloService接口的動態(tài)代理類的實(shí)例。
例程5 HelloServiceProxyFactory.java
package proxy;
import java.lang.reflect.*;
public class HelloServiceProxyFactory {
/** 創(chuàng)建一個實(shí)現(xiàn)了HelloService 接口的動態(tài)代理類的實(shí)例
* 參數(shù)helloService 引用被代理的HelloService 實(shí)例
*/
public static HelloService getHelloServiceProxy(final HelloService helloService){
//創(chuàng)建一個實(shí)現(xiàn)了InvocationHandler接口的匿名類的實(shí)例
InvocationHandler handler=new InvocationHandler(){
public Object invoke(Object proxy,Method method,Object args[])throws Exception{
System.out.println("before calling "+method); //預(yù)處理
Object result=method.invoke(helloService,args);
//調(diào)用被代理的HelloService 實(shí)例的方法
System.out.println("after calling "+method); //事后處理
return result;
}
};
Class classType=HelloService.class;
return (HelloService)Proxy.newProxyInstance(classType.getClassLoader(),
new Class[]{classType},
handler);
}
}
如下所示的Client2 類先創(chuàng)建了一個HelloServiceImpl 實(shí)例,然后創(chuàng)建了一個動態(tài)代理類實(shí)例helloServiceProxy,最后調(diào)用動態(tài)代理類實(shí)例的echo()方法。
例程6 Client2.java
package proxy;
public class Client2{
public static void main(String args[]){
HelloService helloService=new HelloServiceImpl();
HelloService helloServiceProxy=HelloServiceProxyFactory.getHelloServiceProxy(helloService);
System.out.println("動態(tài)代理類的名字為"+helloServiceProxy.getClass().getName());
System.out.println(helloServiceProxy.echo("Hello"));
}
}
運(yùn)行Client2,打印結(jié)果如下:
動態(tài)代理類的名字為$Proxy0
before calling public abstract java.lang.String proxy.HelloService.echo(java.lang.String)
after calling public abstract java.lang.String proxy.HelloService.echo(java.lang.String)
echo:Hello
從結(jié)果看出,動態(tài)代理類的名字為$Proxy0。
PostScript
Java動態(tài)代理機(jī)制的出現(xiàn),使得Java開發(fā)人員不用手工編寫代理類,只要簡單地制定一組接口及委托類對象,便能動態(tài)地獲得代理類。代理類會負(fù)責(zé)將所有的方法調(diào)用分配到委托對象上反射執(zhí)行,配置執(zhí)行過程中,開發(fā)人員還可以進(jìn)行修改
代理設(shè)計模式
代理是一種常用的設(shè)計模式,其目的就是為其他對象提供一個代理以控制對某個對象的訪問。代理類負(fù)責(zé)為委托類預(yù)處理消息、過濾消息并轉(zhuǎn)發(fā)消息,以及進(jìn)行消息被委托類執(zhí)行后的后續(xù)處理。
為了保持行為的一致性,代理類和委托類通常會實(shí)現(xiàn)相同的接口
2. 引入代理能夠控制對委托對象的直接訪問,可以很好的隱藏和保護(hù)委托對象,也更加具有靈活性
代理機(jī)制及其特點(diǎn)
首先讓我們來了解一下如何使用 Java 動態(tài)代理。具體有如下四步驟:
通過實(shí)現(xiàn) InvocationHandler 接口創(chuàng)建自己的調(diào)用處理器;
通過為 Proxy 類指定 ClassLoader 對象和一組 interface 來創(chuàng)建動態(tài)代理類;
通過反射機(jī)制獲得動態(tài)代理類的構(gòu)造函數(shù),其唯一參數(shù)類型是調(diào)用處理器接口類型;
通過構(gòu)造函數(shù)創(chuàng)建動態(tài)代理類實(shí)例,構(gòu)造時調(diào)用處理器對象作為參數(shù)被傳入。
代理類實(shí)例的一些特點(diǎn)?
每個實(shí)例都會關(guān)聯(lián)一個InvocationHandler(調(diào)用處理器對象),在代理類實(shí)例上調(diào)用其代理接口中聲明的方法時,最終都會由InvocationHandler的invoke方法執(zhí)行;
java.lang.Object中有三個方法也同樣會被分派到調(diào)用處理器的 invoke 方法執(zhí)行,它們是 hashCode,equals 和 toString;
代碼示例
最后以一個簡單的動態(tài)代理例子結(jié)束
Java中的23種設(shè)計模式:
Factory(工廠模式), Builder(建造模式), Factory Method(工廠方法模式),
Prototype(原始模型模式),Singleton(單例模式), Facade(門面模式),
Adapter(適配器模式), Bridge(橋梁模式), Composite(合成模式),
Decorator(裝飾模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解釋器模式), Visitor(訪問者模式),
Iterator(迭代子模式), Mediator(調(diào)停者模式), Memento(備忘錄模式),
Observer(觀察者模式), State(狀態(tài)模式), Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(責(zé)任鏈模式)
工廠模式:工廠模式是一種經(jīng)常被使用到的模式,根據(jù)工廠模式實(shí)現(xiàn)的類可以根據(jù)提供的數(shù)據(jù)生成一組類中某一個類的實(shí)例,通常這一組類有一個公共的抽象父類并且實(shí)現(xiàn)了相同的方法,但是這些方法針對不同的數(shù)據(jù)進(jìn)行了不同的操作。首先需要定義一個基類,該類的子類通過不同的方法實(shí)現(xiàn)了基類中的方法。然后需要定義一個工廠類,工廠類可以根據(jù)條件生成不同的子類實(shí)例。當(dāng)?shù)玫阶宇惖膶?shí)例后,開發(fā)人員可以調(diào)用基類中的方法而不必考慮到底返回的是哪一個子類的實(shí)例。
設(shè)計模式主要分三個類型:創(chuàng)建型、結(jié)構(gòu)型和行為型。
其中創(chuàng)建型有:
一、Singleton,單例模式:保證一個類只有一個實(shí)例,并提供一個訪問它的全局訪問點(diǎn)
二、Abstract Factory,抽象工廠:提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們的具體類。
三、Factory Method,工廠方法:定義一個用于創(chuàng)建對象的接口,讓子類決定實(shí)例化哪一個類,F(xiàn)actory Method使一個類的實(shí)例化延遲到了子類。
四、Builder,建造模式:將一個復(fù)雜對象的構(gòu)建與他的表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
五、Prototype,原型模式:用原型實(shí)例指定創(chuàng)建對象的種類,并且通過拷貝這些原型來創(chuàng)建新的對象。
行為型有:
六、Iterator,迭代器模式:提供一個方法順序訪問一個聚合對象的各個元素,而又不需要暴露該對象的內(nèi)部表示。
七、Observer,觀察者模式:定義對象間一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知自動更新。
八、Template Method,模板方法:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中,TemplateMethod使得子類可以不改變一個算法的結(jié)構(gòu)即可以重定義該算法得某些特定步驟。
九、Command,命令模式:將一個請求封裝為一個對象,從而使你可以用不同的請求對客戶進(jìn)行參數(shù)化,對請求排隊(duì)和記錄請求日志,以及支持可撤銷的操作。
十、State,狀態(tài)模式:允許對象在其內(nèi)部狀態(tài)改變時改變他的行為。對象看起來似乎改變了他的類。
十一、Strategy,策略模式:定義一系列的算法,把他們一個個封裝起來,并使他們可以互相替換,本模式使得算法可以獨(dú)立于使用它們的客戶。
十二、China of Responsibility,職責(zé)鏈模式:使多個對象都有機(jī)會處理請求,從而避免請求的送發(fā)者和接收者之間的耦合關(guān)系
十三、Mediator,中介者模式:用一個中介對象封裝一些列的對象交互。
十四、Visitor,訪問者模式:表示一個作用于某對象結(jié)構(gòu)中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用于這個元素的新操作。
十五、Interpreter,解釋器模式:給定一個語言,定義他的文法的一個表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
十六、Memento,備忘錄模式:在不破壞對象的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。
結(jié)構(gòu)型有:
十七、Composite,組合模式:將對象組合成樹形結(jié)構(gòu)以表示部分整體的關(guān)系,Composite使得用戶對單個對象和組合對象的使用具有一致性。
十八、Facade,外觀模式:為子系統(tǒng)中的一組接口提供一致的界面,fa?ade提供了一高層接口,這個接口使得子系統(tǒng)更容易使用。
十九、Proxy,代理模式:為其他對象提供一種代理以控制對這個對象的訪問
二十、Adapter,適配器模式:將一類的接口轉(zhuǎn)換成客戶希望的另外一個接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些類可以一起工作。
二十一、Decrator,裝飾模式:動態(tài)地給一個對象增加一些額外的職責(zé),就增加的功能來說,Decorator模式相比生成子類更加靈活。
二十二、Bridge,橋模式:將抽象部分與它的實(shí)現(xiàn)部分相分離,使他們可以獨(dú)立的變化。
二十三、Flyweight,享元模式
23種設(shè)計模式要在這里詳細(xì)的都說一遍內(nèi)容實(shí)在太多了啊,推薦你一本好書《軟件秘笈:設(shè)計模式那點(diǎn)事》,里面講解的23中設(shè)計模式例子很生動,容易理解,還有JDK中設(shè)計模式應(yīng)用情況,看了收獲挺大的!百度里面搜“設(shè)計模式”,第一條中設(shè)計模式百度百科中就有首推該圖書,瀏覽量在20幾萬以上的,不會錯的。
祝你早日學(xué)會設(shè)計模式!
代理(Proxy)是一種設(shè)計模式,提供了對目標(biāo)對象另外的訪問方式;即通過代理對象訪問目標(biāo)對象.這樣做的好處是:可以在目標(biāo)對象實(shí)現(xiàn)的基礎(chǔ)上,增強(qiáng)額外的功能操作,即擴(kuò)展目標(biāo)對象的功能.
這里使用到編程中的一個思想:不要隨意去修改別人已經(jīng)寫好的代碼或者方法,如果需改修改,可以通過代理的方式來擴(kuò)展該方法
舉個例子來說明代理的作用:假設(shè)我們想邀請一位明星,那么并不是直接連接明星,而是聯(lián)系明星的經(jīng)紀(jì)人,來達(dá)到同樣的目的.明星就是一個目標(biāo)對象,他只要負(fù)責(zé)活動中的節(jié)目,而其他瑣碎的事情就交給他的代理人(經(jīng)紀(jì)人)來解決.這就是代理思想在現(xiàn)實(shí)中的一個例子
用圖表示如下:
代理模式的關(guān)鍵點(diǎn)是:代理對象與目標(biāo)對象.代理對象是對目標(biāo)對象的擴(kuò)展,并會調(diào)用目標(biāo)對象
1.1.靜態(tài)代理(類似于裝飾者模式)
靜態(tài)代理在使用時,需要定義接口或者父類,被代理對象與代理對象一起實(shí)現(xiàn)相同的接口或者是繼承相同父類.
下面舉個案例來解釋:
模擬保存動作,定義一個保存動作的接口:IUserDao.java,然后目標(biāo)對象實(shí)現(xiàn)這個接口的方法UserDao.java,此時如果使用靜態(tài)代理方 式,就需要在代理對象(UserDaoProxy.java)中也實(shí)現(xiàn)IUserDao接口.調(diào)用的時候通過調(diào)用代理對象的方法來調(diào)用目標(biāo)對象.
需要注意的是,代理對象與目標(biāo)對象要實(shí)現(xiàn)相同的接口,然后通過調(diào)用相同的方法來調(diào)用目標(biāo)對象的方法
代碼示例:
接口:IUserDao.java
/**?
*?接口?
*/
public?interface?IUserDao?{?void?save();}
目標(biāo)對象:UserDao.java
/**
*?接口實(shí)現(xiàn)
*?目標(biāo)對象
*/
public?class?UserDao?implements?IUserDao?{
public?void?save()?{
System.out.println("----已經(jīng)保存數(shù)據(jù)!----");
}
}
代理對象:UserDaoProxy.java
/**?
*?代理對象,靜態(tài)代理?
*/
public?class?UserDaoProxy?implements?IUserDao{
//接收保存目標(biāo)對象
private?IUserDao?target;
public?UserDaoProxy(IUserDao?target){????????
this.target=target;????
}
public?void?save()?{
System.out.println("開始事務(wù)...");
trget.save();//執(zhí)行目標(biāo)對象的方法
System.out.println("提交事務(wù)...");????
}
}
測試類:App.java
/**?
*?測試類?
*/
public?class?App?{????
public?static?void?main(String[]?args)?{????????
//目標(biāo)對象????????
UserDao?target?=?new?UserDao();?
//代理對象,把目標(biāo)對象傳給代理對象,建立代理關(guān)系????????
UserDaoProxy?proxy?=?new?UserDaoProxy(target);????????
proxy.save();//執(zhí)行的是代理的方法????
}
}
import java.lang.reflect.Proxy;
A. 創(chuàng)建一個實(shí)現(xiàn)接口InvocationHandler的類,他必須實(shí)現(xiàn)invoke方法
B. 創(chuàng)建被代理的類以及接口。
C. 通過Proxy的靜態(tài)方法newProxyInstance(ClassLoader loader,Class【】interfaces,InvocationHandler handler)創(chuàng)建一個代理
D. 通過代理調(diào)用方法。
java動態(tài)代理:是在運(yùn)行是生成的class對象,在生成時必須提供一組或一個interface給它,然后該class就宣稱它實(shí)現(xiàn)了這些interface。你當(dāng)然可以把該class的實(shí)例當(dāng)做這些interface中的任何一個來用,當(dāng)然,這個DynamicProxy其實(shí)就是一個Proxy,他不會替你做實(shí)質(zhì)性的工作,在生成它的實(shí)例時你必須提供一個handler,由它接管實(shí)際的工作。因此,DynamicProxy必須實(shí)現(xiàn)InvocationHandler接口。
5) 一個動態(tài)代理了和一個InvocationHandler 實(shí)現(xiàn)關(guān)聯(lián)的。每一個動態(tài)代理實(shí)例的調(diào)用都要通過InvocationHandler接口的handler(調(diào)用處理器)來調(diào)用,動態(tài)代理不做任何執(zhí)行操作,只是在創(chuàng)建動態(tài)代理時,把要實(shí)現(xiàn)的接口和handler關(guān)聯(lián),動態(tài)代理要幫助被代理執(zhí)行的任務(wù),要轉(zhuǎn)交給handler來執(zhí)行。其實(shí)就是調(diào)用invoke方法。
本文題目:java代理設(shè)計模式代碼,java源碼中的設(shè)計模式
文章轉(zhuǎn)載:http://chinadenli.net/article6/hegpog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、App開發(fā)、小程序開發(fā)、網(wǎng)站策劃、、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)