選擇 project 或者 file, 點鼠標右鍵,選 properties 菜單,在彈出窗口,選 Resource, 設置 Text file encoding 為 UTF-8 就 ok 了
          posted @ 2008-11-13 18:55 caihaibo 閱讀(530) | 評論 (1)編輯 收藏
           MyEclipse是Eclipse的一個插件,所以,你必須先安裝Eclipse才可以安裝MyEclipse。
          MyEclipse是一個編譯器,要做JAVA程序,就要配置基本的JDK環境變量
          一、安裝JDK

          首先下載JDK 5.0(JDK 5.0的下載頁面為:http://java.sun.com/j2se/1.5.0/download.jsp);然后運行JDK 5.0安裝程序jdk-1_5_0_06-windows-i586-p.exe,安裝過程中所有選項保持默認;最后配置JDK的環境變量:在“我的電腦”上點右鍵—>“屬性”—>“高級”—> “環境變量(N)”。



          新建系統變量JAVA_HOME:C:\Program Files\Java\jdk1.5.0_06;

          新建系統變量CLASSPATH:.;%JAVA_HOME%\lib;(注意:點號表示當前目錄,不能省略)

          在系統變量Path的值的前面加入以下內容:%JAVA_HOME%\bin;(注意:這里的分號不能省略)

          到這里,JDK安裝完畢。

          注意:如果以后要安裝諸如Eclipse、Borland JBuilder、JCreator、IntelliJ IDEA等集成開發環境(IDE,Integrated Development Environment),應該在IDE中編譯運行一個簡單的HelloWorld程序,以保證IDE可以識別出JDK的位置。

          二、安裝Tomcat

          首先下載jakarta-tomcat-5.0.30.zip,之所以下載免安裝版的好處是可以使用多個Tomcat(jakarta-tomcat-5.0.30.zip的下載頁面為:

          http://apache.linuxforum.net/tomcat/tomcat-5/v5.0.30/bin/);

          然后將jakarta-tomcat-5.0.30.zip直接解壓到D盤根目錄:



          最后配置Tomcat的環境變量:在“我的電腦”上點右鍵—>“屬性”—>“高級”—> “環境變量(N)”。

          新建系統變量CATALINA_HOME:D:\jakarta-tomcat-5.0.30

          在系統變量CLASSPATH的值的后面加入:%CATALINA_HOME%\common\lib;

          在系統變量Path的值中"%JAVA_HOME%\bin;"的后面加入以下內容:%CATALINA_HOME%\bin;

          到這里,Tomcat安裝完畢。

          進行完一、二兩步的設置以后,各系統變量的值如下:

          JAVA_HOME:C:\Program Files\Java\jdk1.5.0_06
          CATALINA_HOME:D:\jakarta-tomcat-5.0.30
          CLASSPATH:.;%JAVA_HOME%\lib;%CATALINA_HOME%\common\lib;
          Path:%JAVA_HOME%\bin;%CATALINA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem

          三、安裝Eclipse

          首先下載eclipse-SDK-3.1.2-win32.zip(eclipse-SDK-3.1.2-win32.zip下載地址為:

          http://www.eclipse.org/downloads/);

          然后將eclipse-SDK-3.1.2-win32.zip直接解壓到D盤根目錄:



          到這里, Eclipse安裝完畢。

          四、安裝MyEclipse

          首先下載EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe(EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe 的下載地址為:
          http://www.myeclipseide.com/ContentExpress-display-ceid-10.html);

          然后安裝EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe。注意:安裝時候要選擇Eclipse的安裝路徑,其他選項保持默認。



          安裝完畢之后,將MyEclipse安裝目錄下的features和plugins這2個目錄覆蓋到Eclipse的安裝目錄下。

          最后將剛才安裝的 MyEclipse 卸載。

          解釋一下上面這樣做的原因:因為MyEclipse是Eclipse的插件,所以只要把features和plugins這2個目錄覆蓋到Eclipse的安裝目錄,Eclipse就會自動認出這些插件。

          到這里,MyEclipse安裝完畢。

          五、破解MyEclipse

          運行MyEclipse4.1.1注冊機MyEclipseKeyGen.exe,選擇MyEclipse的版本號,輸入注冊名,生成序列號。(MyEclipse4.x注冊機的下載地址為:

          http://esoft.g8.com.cn/UploadFiles/2006-5/520753587.rar

          運行eclipse.exe(首次運行要求指定Workspace),依次點擊Window ----> Preferences ---->MyEclipse---->Subscription ----> Enter Subscription,輸入注冊名以及注冊機生成的注冊碼。

          到這里,MyEclipse破解完畢。

          六、指定Eclipse+MyEclipse的JRE
          1.設定Eclipse+MyEclipse的JRE

          一般情況下,Eclipse可以自動找到JRE,我們不用進行過多的設置。

          到這里,我們的Eclipse+MyEclipse開發環境就搭建完畢了!
          參考資料:http://www.webdn.com/web_file/program/jsp/0602080402/MyEclipse是Eclipse的一個插件,所以,你必須先安裝Eclipse才可以安裝MyEclipse。
          MyEclipse是一個編譯器,要做JAVA程序,就要配置基本的JDK環境變量
          一、安裝JDK

          首先下載JDK 5.0(JDK 5.0的下載頁面為:http://java.sun.com/j2se/1.5.0/download.jsp);然后運行JDK 5.0安裝程序jdk-1_5_0_06-windows-i586-p.exe,安裝過程中所有選項保持默認;最后配置JDK的環境變量:在“我的電腦”上點右鍵—>“屬性”—>“高級”—> “環境變量(N)”。



          新建系統變量JAVA_HOME:C:\Program Files\Java\jdk1.5.0_06;

          新建系統變量CLASSPATH:.;%JAVA_HOME%\lib;(注意:點號表示當前目錄,不能省略)

          在系統變量Path的值的前面加入以下內容:%JAVA_HOME%\bin;(注意:這里的分號不能省略)

          到這里,JDK安裝完畢。

          注意:如果以后要安裝諸如Eclipse、Borland JBuilder、JCreator、IntelliJ IDEA等集成開發環境(IDE,Integrated Development Environment),應該在IDE中編譯運行一個簡單的HelloWorld程序,以保證IDE可以識別出JDK的位置。

          二、安裝Tomcat

          首先下載jakarta-tomcat-5.0.30.zip,之所以下載免安裝版的好處是可以使用多個Tomcat(jakarta-tomcat-5.0.30.zip的下載頁面為:

          http://apache.linuxforum.net/tomcat/tomcat-5/v5.0.30/bin/);

          然后將jakarta-tomcat-5.0.30.zip直接解壓到D盤根目錄:



          最后配置Tomcat的環境變量:在“我的電腦”上點右鍵—>“屬性”—>“高級”—> “環境變量(N)”。

          新建系統變量CATALINA_HOME:D:\jakarta-tomcat-5.0.30

          在系統變量CLASSPATH的值的后面加入:%CATALINA_HOME%\common\lib;

          在系統變量Path的值中"%JAVA_HOME%\bin;"的后面加入以下內容:%CATALINA_HOME%\bin;

          到這里,Tomcat安裝完畢。

          進行完一、二兩步的設置以后,各系統變量的值如下:

          JAVA_HOME:C:\Program Files\Java\jdk1.5.0_06
          CATALINA_HOME:D:\jakarta-tomcat-5.0.30
          CLASSPATH:.;%JAVA_HOME%\lib;%CATALINA_HOME%\common\lib;
          Path:%JAVA_HOME%\bin;%CATALINA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem

          三、安裝Eclipse

          首先下載eclipse-SDK-3.1.2-win32.zip(eclipse-SDK-3.1.2-win32.zip下載地址為:

          http://www.eclipse.org/downloads/);

          然后將eclipse-SDK-3.1.2-win32.zip直接解壓到D盤根目錄:



          到這里, Eclipse安裝完畢。

          四、安裝MyEclipse

          首先下載EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe(EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe 的下載地址為:
          http://www.myeclipseide.com/ContentExpress-display-ceid-10.html);

          然后安裝EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe。注意:安裝時候要選擇Eclipse的安裝路徑,其他選項保持默認。



          安裝完畢之后,將MyEclipse安裝目錄下的features和plugins這2個目錄覆蓋到Eclipse的安裝目錄下。

          最后將剛才安裝的 MyEclipse 卸載。

          解釋一下上面這樣做的原因:因為MyEclipse是Eclipse的插件,所以只要把features和plugins這2個目錄覆蓋到Eclipse的安裝目錄,Eclipse就會自動認出這些插件。

          到這里,MyEclipse安裝完畢。

          五、破解MyEclipse

          運行MyEclipse4.1.1注冊機MyEclipseKeyGen.exe,選擇MyEclipse的版本號,輸入注冊名,生成序列號。(MyEclipse4.x注冊機的下載地址為:

          http://esoft.g8.com.cn/UploadFiles/2006-5/520753587.rar

          運行eclipse.exe(首次運行要求指定Workspace),依次點擊Window ----> Preferences ---->MyEclipse---->Subscription ----> Enter Subscription,輸入注冊名以及注冊機生成的注冊碼。

          到這里,MyEclipse破解完畢。

          六、指定Eclipse+MyEclipse的JRE
          1.設定Eclipse+MyEclipse的JRE

          一般情況下,Eclipse可以自動找到JRE,我們不用進行過多的設置。

          到這里,我們的Eclipse+MyEclipse開發環境就搭建完畢了!
          參考資料:http://www.webdn.com/web_file/program/jsp/0602080402/MyEclipse是Eclipse的一個插件,所以,你必須先安裝Eclipse才可以安裝MyEclipse。
          MyEclipse是一個編譯器,要做JAVA程序,就要配置基本的JDK環境變量
          一、安裝JDK

          首先下載JDK 5.0(JDK 5.0的下載頁面為:http://java.sun.com/j2se/1.5.0/download.jsp);然后運行JDK 5.0安裝程序jdk-1_5_0_06-windows-i586-p.exe,安裝過程中所有選項保持默認;最后配置JDK的環境變量:在“我的電腦”上點右鍵—>“屬性”—>“高級”—> “環境變量(N)”。



          新建系統變量JAVA_HOME:C:\Program Files\Java\jdk1.5.0_06;

          新建系統變量CLASSPATH:.;%JAVA_HOME%\lib;(注意:點號表示當前目錄,不能省略)

          在系統變量Path的值的前面加入以下內容:%JAVA_HOME%\bin;(注意:這里的分號不能省略)

          到這里,JDK安裝完畢。

          注意:如果以后要安裝諸如Eclipse、Borland JBuilder、JCreator、IntelliJ IDEA等集成開發環境(IDE,Integrated Development Environment),應該在IDE中編譯運行一個簡單的HelloWorld程序,以保證IDE可以識別出JDK的位置。

          二、安裝Tomcat

          首先下載jakarta-tomcat-5.0.30.zip,之所以下載免安裝版的好處是可以使用多個Tomcat(jakarta-tomcat-5.0.30.zip的下載頁面為:

          http://apache.linuxforum.net/tomcat/tomcat-5/v5.0.30/bin/);

          然后將jakarta-tomcat-5.0.30.zip直接解壓到D盤根目錄:



          最后配置Tomcat的環境變量:在“我的電腦”上點右鍵—>“屬性”—>“高級”—> “環境變量(N)”。

          新建系統變量CATALINA_HOME:D:\jakarta-tomcat-5.0.30

          在系統變量CLASSPATH的值的后面加入:%CATALINA_HOME%\common\lib;

          在系統變量Path的值中"%JAVA_HOME%\bin;"的后面加入以下內容:%CATALINA_HOME%\bin;

          到這里,Tomcat安裝完畢。

          進行完一、二兩步的設置以后,各系統變量的值如下:

          JAVA_HOME:C:\Program Files\Java\jdk1.5.0_06
          CATALINA_HOME:D:\jakarta-tomcat-5.0.30
          CLASSPATH:.;%JAVA_HOME%\lib;%CATALINA_HOME%\common\lib;
          Path:%JAVA_HOME%\bin;%CATALINA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem

          三、安裝Eclipse

          首先下載eclipse-SDK-3.1.2-win32.zip(eclipse-SDK-3.1.2-win32.zip下載地址為:

          http://www.eclipse.org/downloads/);

          然后將eclipse-SDK-3.1.2-win32.zip直接解壓到D盤根目錄:



          到這里, Eclipse安裝完畢。

          四、安裝MyEclipse

          首先下載EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe(EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe 的下載地址為:
          http://www.myeclipseide.com/ContentExpress-display-ceid-10.html);

          然后安裝EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe。注意:安裝時候要選擇Eclipse的安裝路徑,其他選項保持默認。



          安裝完畢之后,將MyEclipse安裝目錄下的features和plugins這2個目錄覆蓋到Eclipse的安裝目錄下。

          最后將剛才安裝的 MyEclipse 卸載。

          解釋一下上面這樣做的原因:因為MyEclipse是Eclipse的插件,所以只要把features和plugins這2個目錄覆蓋到Eclipse的安裝目錄,Eclipse就會自動認出這些插件。

          到這里,MyEclipse安裝完畢。

          五、破解MyEclipse

          運行MyEclipse4.1.1注冊機MyEclipseKeyGen.exe,選擇MyEclipse的版本號,輸入注冊名,生成序列號。(MyEclipse4.x注冊機的下載地址為:

          http://esoft.g8.com.cn/UploadFiles/2006-5/520753587.rar

          運行eclipse.exe(首次運行要求指定Workspace),依次點擊Window ----> Preferences ---->MyEclipse---->Subscription ----> Enter Subscription,輸入注冊名以及注冊機生成的注冊碼。

          到這里,MyEclipse破解完畢。

          六、指定Eclipse+MyEclipse的JRE
          1.設定Eclipse+MyEclipse的JRE

          一般情況下,Eclipse可以自動找到JRE,我們不用進行過多的設置。

          到這里,我們的Eclipse+MyEclipse開發環境就搭建完畢了!
          參考資料:http://www.webdn.com/web_file/program/jsp/0602080402/
          posted @ 2008-11-13 11:43 caihaibo 閱讀(532) | 評論 (0)編輯 收藏
           
          在Windows Xp系統中,按“Alt+Ctrl+Delete”出現的是任務管理器,不是
          安全對話框這樣不能鎖定計算機,可以打開控制面板,點擊“切換到經典視圖”
          后選擇“用戶賬戶”,在選擇“更改用戶登錄或注銷方式”,不選“使用歡迎
          屏幕”,然后確定。在按Alt+Ctrl+Delete”出現的是Windows安全對話框,點
          “鎖定計算機”即可OK。
          posted @ 2008-11-12 13:33 caihaibo 閱讀(218) | 評論 (0)編輯 收藏
          今天在導入一個工程時,編譯并打包到Tomcat后,發現出現java.lang.UnsupportedClassVersionError: Bad version number in .class file異常,檢查了一下我的myEclipse,發現不知道啥時候不小心將編譯器改成JDK6.0了,那個工程是從同事的機上拷貝過來的,用的編譯器是JDK5.0,試了一下,果然是這個問題引起。
              那次在Linux上部署工程時也出現過因為版本不同引起的問題,那時我們用的IDE的編譯器是JDK5.0,而那臺Linux裝的是JDK6.0,部署后發現很多功能都出錯,看來有些東西還是得注意一下啊。
              附,在myEclipse中改變編譯器的方法:Project->Properties->Java Compiler->Configure Workspace Setting,在彈出的頁面中可以進行設置。
          posted @ 2008-11-09 21:59 caihaibo 閱讀(282) | 評論 (1)編輯 收藏
          手動安裝的tomcat沒有生成admin跟manager用戶,要進入tomcat的admin管理界面必須自己手動添加.

          打開tomcat安裝目錄下的conf/tomcat-users.xml文件,在<tomcat-users>和</tomcat-user>中間添加:

          <role rolename="manager"/>
          <role rolename="admin"/>

          <user username="manager" password="tomcat" roles="manager"/>
          <user username="admin" password="tomcat" roles="admin"/>

          其中user字段中的username和password就是你的用戶名跟密碼,添加完成后就可以用這個用戶名跟密碼登錄tomcat的admin以及manager頁面了.

          http://localhost:8080/admin
          http://localhost:8080/manager

          懶人方法:

          <user username="both" password="tomcat"

                                            roles="manager,tomcat,role1"/>

          直接添加到此處,下一次tomcat啟動時將自動添加一個manager用戶!

          posted @ 2008-11-09 21:15 caihaibo 閱讀(184) | 評論 (0)編輯 收藏
          MyEclipse 6.0官方下載地址:
          http://www.myeclipseide.com/module-htmlpages-display-pid-4.html

          MyEclipse 6.0注冊序列號:
          Subscriber:QQ24785490
          Subscription Code:DLR8ZC-855551-65657857678050018
          posted @ 2008-11-05 18:19 caihaibo 閱讀(4016) | 評論 (9)編輯 收藏
           mysql是我以前學習和練習所使用的數據,現在在工作中也在使用,之前公司里用oracle,我在做自己的東西的時候覺得用oracle太不方便,于是就找了mysql(當時也考慮過sqlserver,覺得還是沒有mysql小巧),從那時起我就開始接觸下面所說的幾種mysql客戶端工具了。
                     我接觸的mysql客戶端工具一共有4個,mysqlfront, mysqlyog, mysqlbrowser, ems mysql manager,其中mysqlbrowser是我最早使用的一個mysql客戶端工具(一年前),當時是在一個自己接的交友網站中使用mysql,于是就找到了這個mysqlbrowser,
          mysqlbrowser的優點是簡單,及其的簡單,安裝之后能夠立刻上手,馬上就能使用的那種,布局也很簡陋,功能也很簡陋,簡單使用沒有問題,尤其是剛開始學習mysql的同學,可以嘗試一下。

                    接下來我使用的是ems,ems到了另外一個極端,強大,非常強大,表和字段的任何屬性都能隨意修改,那么它強大的同時必然帶來了使用的復雜,可以說剛開始 使用的時候很不習慣它的布局。它有一個我比較贊賞的優點,就是快捷鍵,它有很多快捷鍵,這一點和mysqlbrowser比有天壤之別。

                   我第三個遇到的mysql客戶端工具是mysqlfront,它給我的感覺是功能和易用性介于mysqlbrowser和ems之間,它有不少缺點,不如說無法修改表的一些屬性,和一些字段的屬性等等。

                    第四個就是mysqlyog,這個工具給我的感覺是介于mysqlbrowser和mysqlfront之間,總體感覺沒有mysqlfront強大。
                    通過我的一些認識,我覺得它們的排名是1mysqlbrowser,2mysqlyog,3mysqlfront,4ems。這是根據功能的強大與否來排名的。ems的功能是最強大,所以我現在一直在使用它。我也推薦大家使用ems mysql manager。ems有兩個版本,lite版(免費),professional(專業版),我一直使用的lite版,程序員而言,lite版已經完全夠用了。
          posted @ 2008-11-04 10:43 caihaibo 閱讀(181) | 評論 (0)編輯 收藏
          模板是指在薄片塑料板上面寫字后挖空,再使用毛筆或色筆涂滿挖空部分,就能看到純手工而以不失工整的字樣,看到模板上的挖空形狀,馬上就知道最后會變出什么樣子的字,不過實際上所顯現出來的字樣還是要依所使用的畫筆種類而定.拿黑色簽字筆當畫筆,結果當然就是簽字筆的字樣;當用鉛筆來畫,得到的也只會是灰黑色的鉛筆字;如果用五顏六色的彩色筆,自然能創出讓人眼花的多色字.但是,無論使用哪種文具,制作出來的字樣都還是脫不了模板上已經固定的形狀。

             下面我們用例子說明模板方法

            程序示例類之間的關系

            1.模板類,相當于我們上面提到的薄片塑料板

          Java代碼 復制代碼
          1. package com.pattern.templateMethod;   
          2.   
          3. /**  
          4.  * 抽象類,充當模板角色  
          5.  * @author administrator  
          6.  *  
          7.  */  
          8. public abstract class AbstractDisplay {   
          9.     //由子類實現的抽象方法   
          10.     public abstract void open();      
          11.     public abstract void print();   
          12.     public abstract void close();   
          13.     //抽象類實現的方法,final可以保證在子類不會被修改   
          14.     public final void display() {   
          15.         open();   //先open...   
          16.         for(int i=0; i < 5; i++) {  //反復輸出5次   
          17.             print();     
          18.         }   
          19.         close(); //輸出完畢,close   
          20.     }   
          21. }  

           

            2.字符類,輸出單個字符

          Java代碼 復制代碼
          1. package com.pattern.templateMethod;   
          2.   
          3. public class CharDisplay extends AbstractDisplay {   
          4.     private char ch;     //應輸出的字符   
          5.     public CharDisplay(char ch) {  //把構造函數傳遞過來的字符ch,存儲在字段內   
          6.         this.ch = ch;   
          7.     }   
          8.      
          9.     public void open() {   
          10.         System.out.print("<<");   //輸出"<<"作為開始字符串   
          11.     }   
          12.     public void close() {   
          13.         System.out.println(">>");  //輸出 ">>"作為結束字符串   
          14.     }   
          15.     public void print() {   
          16.         System.out.print(ch);    //輸出存儲在字段的字符   
          17.     }   
          18.   
          19. }  

           

             3.字符串類,輸出字符串

          Java代碼 復制代碼
          1. package com.pattern.templateMethod;   
          2.   
          3. /**  
          4.  *   
          5.  * @author administrator  
          6.  */  
          7. public class StringDisplay extends AbstractDisplay {   
          8.     private String string;  //應輸出的字符串   
          9.     private int width;      //以byte為單位所求出的字符串的"長度"   
          10.        
          11.     public StringDisplay(String string) {   
          12.         this.string =string;   
          13.         width = string.getBytes().length;   
          14.     }   
          15.   
          16.     public void open() {  //打印頭裝飾字符串   
          17.         printLine();   
          18.     }   
          19.     public void print() { //打印內容   
          20.         System.out.println("|"+string+"|");   
          21.     }   
          22.     public void close() { //打印尾裝飾字符串   
          23.         printLine();   
          24.     }   
          25.   
          26.     public void printLine() {   
          27.         System.out.print("+");  //輸出"+"號表示邊框位置   
          28.         for(int i=0; i < width; ++i) {   
          29.             System.out.print("-");  //當作線段   
          30.         }   
          31.         System.out.println("+");  //輸出"+"號表示邊框位置   
          32.     }   
          33. }  

            4.測試類

          Java代碼 復制代碼
          1. package com.pattern.templateMethod;   
          2.   
          3. public class Main {   
          4.     public static void main(String[] args) {   
          5.         //建立1個有'A'的CharDisplay的對象   
          6.         AbstractDisplay d1 = new CharDisplay('A');   
          7.         //建立1個有"Hello world"的StringDisplay的對象   
          8.         AbstractDisplay d2 = new StringDisplay("Hello World");   
          9.            
          10.         //d1,d2都是AbstractDisplay的子類對象,可以調用繼承到的display()方法   
          11.         d1.display();   
          12.         d2.display();   
          13.     }   
          14. }  

           

           輸出:

           

          C代碼 復制代碼
          1.  <<AAAAA>>   
          2. +-----------+   
          3. |Hello World|   
          4. |Hello World|   
          5. |Hello World|   
          6. |Hello World|   
          7. |Hello World|   
          8. +-----------+  

           

           

           

           

           

          設計思想:

            作為模板的方法定義在父類(父類為抽象類),而方法定義使用抽象方法,實現抽象方法的是子類,要在子類實現方法,才能決定具體的操作。如果在不同的子類執行不同實現就可以發展出不同的處理內容。不過,無論在哪個子類執行任何一種實現,處理的大致流程都還是要依照父類制定的方式。

          posted @ 2008-11-04 10:32 caihaibo 閱讀(385) | 評論 (0)編輯 收藏

          1. 意圖:
          為其他對象提供一種代理以控制對這個對象的訪問

          2. 別名:
          surrogate替身

          3. 動機
          按需創建, 替代對象

          4. 適用性
          * 遠程代理
          * 虛代理
          * 保護代理
          * 智能指引

          5. 結構


          6. 實例

          Java代碼 復制代碼
          1. package net.yeah.fanyamin.pattern.proxy;   
          2.   
          3. /**  
          4.  * @author walter  
          5.  */  
          6. interface Greet {   
          7.     void sayHello(String name);   
          8.     void goodBye();   
          9. }   
          10.   
          11. class GreetImpl implements Greet {   
          12.     public void sayHello(String name) {   
          13.         System.out.println("Hello " + name);   
          14.     }   
          15.     public void goodBye() {   
          16.         System.out.println("Good bye.");   
          17.     }   
          18. }   
          19.   
          20. public class SimpleProxy implements Greet {   
          21.     private Greet greet = null;   
          22.        
          23.     SimpleProxy(Greet greet) {   
          24.         this.greet = greet;   
          25.     }   
          26.        
          27.     public void sayHello(String name) {   
          28.         System.out.println("--before method sayHello");   
          29.         greet.sayHello(name);   
          30.         System.out.println("--after method sayHello");   
          31.     }   
          32.        
          33.     public void goodBye() {   
          34.         System.out.println("--before method goodBye");   
          35.         greet.goodBye();   
          36.         System.out.println("--after method goodBye");   
          37.     }   
          38.     /**  
          39.      * @param args  
          40.      */  
          41.     public static void main(String[] args) {   
          42.         Greet greet = new SimpleProxy(new GreetImpl());   
          43.         greet.sayHello("walter");   
          44.         greet.goodBye();   
          45.   
          46.     }   
          47.   
          48. }  

           利用JDK中的動態代理

          Java代碼 復制代碼
          1. /**  
          2.  *   
          3.  */  
          4. package net.yeah.fanyamin.pattern.proxy;   
          5.   
          6. import java.lang.reflect.InvocationTargetException;   
          7. import java.lang.reflect.Method;   
          8.   
          9. /**  
          10.  * @author walter  
          11.  */  
          12. public class DebugProxy implements java.lang.reflect.InvocationHandler {   
          13.   
          14.     private Object obj;   
          15.   
          16.     public static Object newInstance(Object obj) {   
          17.         return java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(),   
          18.                                                         obj.getClass().getInterfaces(), new DebugProxy(obj));   
          19.     }   
          20.   
          21.     private DebugProxy(Object obj) {   
          22.         this.obj = obj;   
          23.     }   
          24.   
          25.     public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {   
          26.         Object result;   
          27.         try {   
          28.             System.out.println("--before method " + m.getName());   
          29.             result = m.invoke(obj, args);   
          30.         } catch (InvocationTargetException e) {   
          31.             throw e.getTargetException();   
          32.         } catch (Exception e) {   
          33.             throw new RuntimeException("unexpected invocation exception: " + e.getMessage());   
          34.         } finally {   
          35.             System.out.println("--after method " + m.getName());   
          36.         }   
          37.         return result;   
          38.     }   
          39.   
          40.     /**  
          41.      * @param args  
          42.      */  
          43.     public static void main(String[] args) {   
          44.         Greet greet = (Greet) DebugProxy.newInstance(new GreetImpl());   
          45.         greet.sayHello("walter");   
          46.         greet.goodBye();   
          47.     }   
          48.   
          49. }  



          動態代理確實很有價值,而且java的反射機制其實性能并不慢,只不過被代理的Object需要有個Interface就是了。
          實際中,代理多用在訪問,權限控制
          其實從類的實現表現形式來說,和裝飾模式,適配器模式,都比較相似,只不過具體實現意義不一樣
          posted @ 2008-11-04 10:20 caihaibo 閱讀(110) | 評論 (0)編輯 收藏

          1. 以一個算術運算為例,傳統做法為:

          java 代碼
          1. package org.common;   
          2.   
          3. public class Calculate {   
          4.        
          5.     public String getResult(float a,float b,char c){   
          6.            
          7.         float add = a+b;   
          8.         float sub = a-b;   
          9.         float mult = a*b;   
          10.         float division = a/b;   
          11.            
          12.         switch(c){   
          13.             case '+':   
          14.                 return "相加結果為:" + add;   
          15.             case '-':   
          16.                 return "相減結果為:" + sub;   
          17.             case '*':   
          18.                 return "相乘結果為:" + mult;   
          19.             case '/':   
          20.                 return "相除結果為:" + division;   
          21.             default:   
          22.                 return "出錯";   
          23.         }   
          24.     }   
          25.   
          26. }  

           

          java 代碼
          1. package org.common;   
          2.   
          3. public class Test {   
          4.        
          5.     public static void main(String[] args){   
          6.         float a = 200;   
          7.         float b = 50;   
          8.         Calculate cal = new Calculate();   
          9.         System.out.println(cal.getResult(a, b, '+'));   
          10.         System.out.println(cal.getResult(a, b, '-'));   
          11.         System.out.println(cal.getResult(a, b, '*'));   
          12.         System.out.println(cal.getResult(a, b, '/'));   
          13.         System.out.println(cal.getResult(a, b, '('));   
          14.     }   
          15.   
          16. }   

           

          運行結果為:

           相加結果為:250.0
          相減結果為:150.0
          相乘結果為:10000.0
          相除結果為:4.0
          出錯

          2. 用策略模式來實現:

          策略模式的用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。
          策略模式使得算法可以在不影響到客戶端的情況下發生變化。使用策略模式可以把行為和環境分割開來。
          環境類負責維持和查詢行為類,各種算法則在具體策略中提供。由于算法和環境獨立開來,算法的修改都不會影響環境和客戶端

          策略模式:

          由三部分組成

          A:  抽象策略角色:策略類,通常由一個接口或者抽象類實現
          B:  具體策略角色:包裝了相關的算法和行為
          C:  環境角色:持有一個策略類的引用,最終給客戶端調用的。

          一個抽象策略角色:

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 抽象策略角色  
          4.  */  
          5. public abstract class AbstractStrategy {   
          6.   
          7.     public abstract String calculate(float a,float b);   
          8. }   

          幾個具體策略角色:

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 具體策略角色  
          4.  */  
          5. public class SubStrategy extends AbstractStrategy{   
          6.   
          7.     public  String calculate(float a,float b){   
          8.         float result = a-b;   
          9.         return "相減結果為:" + result;   
          10.     }   
          11. }  

           

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 具體策略角色  
          4.  */  
          5. public class AddStrategy extends AbstractStrategy{   
          6.   
          7.     public  String calculate(float a,float b){   
          8.         float result = a+b;   
          9.         return "相加結果為:" + result;   
          10.     }   
          11. }   

           

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 具體策略角色  
          4.  */  
          5. public class MultStrategy extends AbstractStrategy{   
          6.   
          7.     public  String calculate(float a,float b){   
          8.         float result = a*b;   
          9.         return "相乘結果為:" + result;   
          10.     }   
          11. }  

           

           

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 具體策略角色  
          4.  */  
          5. public class DivisionStrategy extends AbstractStrategy{   
          6.   
          7.     public  String calculate(float a,float b){   
          8.         float result = a/b;   
          9.         return "相除結果為:" + result;   
          10.     }   
          11. }   

          環境角色:

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 環境角色,最終給客戶端調用的  
          4.  */  
          5. public class ContextRole {   
          6.   
          7.     /**  
          8.      * 擁有一個策略類的引用  
          9.      */  
          10.     private AbstractStrategy abstactStrategy;   
          11.        
          12.     public ContextRole(AbstractStrategy abstactStrategy){   
          13.         this.abstactStrategy = abstactStrategy;   
          14.     }   
          15.        
          16.     public String calculate(float a,float b) {   
          17.         String result = abstactStrategy.calculate(a, b);   
          18.         return result;   
          19.     }   
          20. }  

          客戶端調用:

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 客戶端  
          4.  */  
          5. public class Test {   
          6.        
          7.     public static void main(String[] args){   
          8.         float a = 200;   
          9.         float b = 25;   
          10.            
          11.         ContextRole contextRole1 = new ContextRole(new AddStrategy());   
          12.         System.out.println(contextRole1.calculate(a, b));   
          13.            
          14.         ContextRole contextRole2 = new ContextRole(new SubStrategy());   
          15.         System.out.println(contextRole2.calculate(a, b));   
          16.            
          17.         ContextRole contextRole3 = new ContextRole(new MultStrategy());   
          18.         System.out.println(contextRole3.calculate(a, b));   
          19.            
          20.         ContextRole contextRole4 = new ContextRole(new DivisionStrategy());   
          21.         System.out.println(contextRole4.calculate(a, b));   
          22.            
          23.     }   
          24.   
          25. }   

           

          輸出結果為:

          相加結果為:225.0
          相減結果為:175.0
          相乘結果為:5000.0
          相除結果為:8.0

          總結:

          策略模式優點:

          1.可以很方便的動態改變算法或行為

          2.避免使用多重條件轉移語句

          策略模式缺點:


          1.客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。
          2.造成很多的策略類。

          posted @ 2008-11-04 09:38 caihaibo 閱讀(267) | 評論 (0)編輯 收藏
          僅列出標題
          共8頁: 上一頁 1 2 3 4 5 6 7 8 下一頁 
          主站蜘蛛池模板: 化德县| 松滋市| 白朗县| 临泉县| 宣武区| 兴宁市| 万安县| 芒康县| 阿荣旗| 福鼎市| 新野县| 高雄市| 托克逊县| 苏州市| 南陵县| 阿鲁科尔沁旗| 通江县| 涟源市| 奉化市| 方山县| 邢台市| 石渠县| 昌乐县| 东乌珠穆沁旗| 平遥县| 昌平区| 通城县| 长治市| 永寿县| 农安县| 漾濞| 武义县| 陆川县| 墨竹工卡县| 贵溪市| 昌宁县| 伊宁市| 万荣县| 张家口市| 大新县| 怀化市|