九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
JAVA 服務(wù)提供者框架介紹

      服務(wù)提供者框架是指:多個(gè)服務(wù)提供者實(shí)現(xiàn)一個(gè)服務(wù),系統(tǒng)為客戶端提供多個(gè)實(shí)現(xiàn),并把他們從多個(gè)實(shí)現(xiàn)中解耦出來(lái)。服務(wù)提供者的改變對(duì)它們的客戶端是透明的,這樣提供了更好的可擴(kuò)展性。例如,JDBC,JMS等就是用了服務(wù)提供者框架

      他們之間的關(guān)系如下圖:

  


 
 

   1.服務(wù)具體實(shí)現(xiàn)類和服務(wù)提供者實(shí)現(xiàn)類是服務(wù)提供者自己去實(shí)現(xiàn)。以JDBC為例,這2個(gè)模塊由具體的數(shù)據(jù)庫(kù)提供商來(lái)實(shí)現(xiàn)。

   2.其他三個(gè)模塊是java對(duì)數(shù)據(jù)庫(kù)提供商怎么實(shí)現(xiàn)上面2個(gè)模塊的一個(gè)約束。比如:提供服務(wù)者實(shí)現(xiàn)類必須實(shí)現(xiàn)服務(wù)提供者接口。才能成功注冊(cè)到服務(wù)提供者注冊(cè)類。以JDBC為例,所有的數(shù)據(jù)庫(kù)提供商只需要按照接口里面定義的規(guī)則來(lái)操作,都能成功地使java連上他們的數(shù)據(jù)庫(kù)。

 

    下面以mysql數(shù)據(jù)庫(kù)為例簡(jiǎn)單說(shuō)明一下mysql數(shù)據(jù)庫(kù)提供商是如何實(shí)現(xiàn)這些接口的。

    1.我們?cè)趈ava中獲取mysql連接對(duì)象源代碼如下:

 

   

Java代碼  
  1. Class.forName("com.mysql.jdbc.Driver");   
  2. DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123");  

 

 

 

       從這個(gè)地方可以看出:我們只需要更換數(shù)據(jù)庫(kù)的驅(qū)動(dòng)名稱與建立連接的URL,用戶名等信息,就可以完全切換到另外一個(gè)數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)底部怎么操作的我們不清楚,也沒必要清楚。我們獲取的連接對(duì)象是Connection,查看java.sql.Connection這個(gè)類,會(huì)發(fā)現(xiàn)它只是一個(gè)接口。我們得到的只是一個(gè)接口,怎么可能能夠操作數(shù)據(jù)庫(kù)呢?其實(shí)這里得到的不是Connection接口,而是它的一個(gè)實(shí)現(xiàn)類,只是對(duì)于客戶端不可見而已。這可能就是所謂的面向接口編程,客戶端只需要知道它該知道的信息,服務(wù)端告訴客戶端,你可以調(diào)用哪些方法。至于具體方法怎么實(shí)現(xiàn)是服務(wù)端的事情,客服端就不需要管,也不需要知道了。

     下面我們看看簡(jiǎn)單的這2個(gè)語(yǔ)句分別做了什么事情:

      語(yǔ)句一: Class.forName("...")。這樣一個(gè)語(yǔ)句會(huì)實(shí)例化一個(gè)com.mysql.jdbc.Driver類(提供服務(wù)者實(shí)現(xiàn)類),并將這個(gè)類的實(shí)例注冊(cè)到DriverManager(服務(wù)提供者注冊(cè)類)。

       語(yǔ)句二: 通過(guò)建立連接的URL,用戶名,密碼來(lái)獲取建立到mysql數(shù)據(jù)庫(kù)的連接。是這樣的,DriverManager通過(guò)你傳進(jìn)來(lái)的url信息判斷出你是要獲取那個(gè)服務(wù)提供者提供的服務(wù)。也就是語(yǔ)句一已經(jīng)將提供服務(wù)者實(shí)現(xiàn)類注冊(cè)到DriverManager了,DriverManager獲取到這個(gè)服務(wù)提供者實(shí)現(xiàn)類對(duì)象之后,通過(guò)調(diào)用它的getService(mysql里面是connect方法)方法獲取到服務(wù)具體實(shí)現(xiàn)類對(duì)象,返回的卻是java.sql.Connection接口對(duì)象(因?yàn)榉?wù)具體實(shí)現(xiàn)類實(shí)現(xiàn)了Connection接口),這樣把服務(wù)具體實(shí)現(xiàn)類對(duì)象隱藏了。提供了很好的擴(kuò)展性。

      最后,我們自己來(lái)測(cè)試一個(gè)。

      以北京地鐵進(jìn)出控制為例:現(xiàn)在北京地鐵進(jìn)出都是刷卡,有二種卡:1.一卡通(比如一次性沖值50元,進(jìn)地鐵刷一次,出地鐵刷一次,扣2元)。2.一次性卡(進(jìn)地鐵刷一次,出地鐵插入回收。)這2種卡都可以實(shí)現(xiàn)進(jìn)出地鐵功能,但實(shí)現(xiàn)的具體方法是有區(qū)別的:一卡通:需要獲取這卡余額是多少,然后扣掉2元。如果余額不足2元怎么處理等。一次性卡則沒必要了。

     服務(wù)接口源碼:

 

   

Java代碼  
  1. /** 
  2.  * 進(jìn)出地鐵服務(wù)接口 
  3.  * @author Administrator 
  4.  * 
  5.  */  
  6. public interface SubWayInterface {  
  7.       
  8.     //進(jìn)入地鐵  
  9.     public boolean in();  
  10.       
  11.     //出地鐵  
  12.     public boolean out();  
  13.   
  14. }  

 

 

   

   服務(wù)實(shí)現(xiàn)源碼:

 

 

Java代碼  
  1. /** 
  2.  * 一卡通地鐵進(jìn)出服務(wù)實(shí)現(xiàn) 
  3.  * @author Administrator 
  4.  * 
  5.  */  
  6. public class SubWayImpl implements SubWayInterface {  
  7.   
  8.     public boolean in() {  
  9.         System.out.println("通過(guò)一卡通進(jìn)入地鐵");  
  10.         /** 
  11.          * 進(jìn)行一些處理,然后返回是否放行 
  12.          */  
  13.         return false;  
  14.     }  
  15.   
  16.     public boolean out() {  
  17.         System.out.println("通過(guò)一卡通出地鐵");  
  18.         /** 
  19.          * 進(jìn)行一些處理,然后返回是否放行 
  20.          */  
  21.         return false;  
  22.     }  
  23.   
  24. }  

 

 

    

   服務(wù)提供者接口源碼:

 

 

  

Java代碼  
  1. /** 
  2.  * 地鐵進(jìn)出服務(wù)提供者接口 
  3.  * @author Administrator 
  4.  * 
  5.  */  
  6. public interface SubwayProviderInterface {  
  7.       
  8.     public SubWayInterface getService();  
  9.   
  10. }  

 

 

    服務(wù)提供者接口實(shí)現(xiàn)源碼:

 

 

   

Java代碼  
  1. /** 
  2.  * 服務(wù)提供者實(shí)現(xiàn)類 
  3.  * @author Administrator 
  4.  * 
  5.  */  
  6. public class SubwayProviderImpl implements SubwayProviderInterface {  
  7.   
  8.     static {  
  9.         ServiceManager.registerProvider("一卡通", new SubwayProviderImpl());  
  10.     }  
  11.   
  12.     public SubWayInterface getService() {  
  13.         return new SubWayImpl();  
  14.     }  
  15.   
  16. }  

  

 

   服務(wù)提供者注冊(cè)類實(shí)現(xiàn)源碼:

 

 

  

Java代碼  
  1. /** 
  2.  * 服務(wù)提供者注冊(cè)類 
  3.  *  
  4.  * @author Administrator 
  5.  *  
  6.  */  
  7. public class ServiceManager {  
  8.   
  9.     private ServiceManager() {  
  10.   
  11.     }  
  12.   
  13.     private static final Map<String, SubwayProviderInterface> providers = new ConcurrentHashMap<String, SubwayProviderInterface>();  
  14.   
  15.     public static void registerProvider(String name, SubwayProviderInterface p) {  
  16.         providers.put(name, p);  
  17.     }  
  18.   
  19.     public static SubWayInterface getService(String name) {  
  20.   
  21.         SubwayProviderInterface p = providers.get(name);  
  22.   
  23.         if (p == null) {  
  24.             throw new IllegalArgumentException(  
  25.                     "No provider registered with name:" + name);  
  26.         }  
  27.   
  28.         return p.getService();  
  29.   
  30.     }  
  31.   
  32. }  

  

 

     客戶端測(cè)試類:

 

    

Java代碼  
  1. /** 
  2.  * 客戶端測(cè)試類 
  3.  * @author Administrator 
  4.  * 
  5.  */  
  6. public class Test {  
  7.   
  8.     /** 
  9.      * @param args 
  10.      * @throws ClassNotFoundException  
  11.      */  
  12.     public static void main(String[] args) throws ClassNotFoundException {  
  13.           
  14.         Class.forName("cn.netjava.cgl.subway.SubwayProviderImpl");  
  15.         SubWayInterface swi = ServiceManager.getService("一卡通");  
  16.         swi.in();  
  17.         swi.out();  
  18.     }  
  19. }  

 

   測(cè)試類Class.forName("")里面的參數(shù)你可能跟我的不同,看你服務(wù)提供者實(shí)現(xiàn)類放在哪個(gè)包下面了。我的是在:cn.netjava.cgl.subway包下面。

 

 

 

     

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java技術(shù)回顧之JNDI(一):JNDI應(yīng)用實(shí)例,Java技術(shù)文章,Java系列教程,Java
java泛型方法使用
ASP.NET Core中的依賴注入(3): 服務(wù)的注冊(cè)與提供
net core WebApi——依賴注入Autofac
深入掌握J(rèn)MS(一):JSM基礎(chǔ)
java接口的描述,
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服