春風博客

          春天里,百花香...

          導航

          <2007年12月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          統計

          公告

          MAIL: junglesong@gmail.com
          MSN: junglesong_5@hotmail.com

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          使用泛型類簡化服務層(Service)類的設計

          領域層類可以理解為程序運行時數據流的功能單位,而服務層類是為領域層類提供服務的,常見的服務有增刪改查等操作,在沒有泛型之前,我們只能采用一個服務類為一個領域類提供服務的方案,如果說服務的性質類似,如都是增刪改查等,則代碼的功能重復性很高,維護起來也很麻煩.如果采用了泛型類,我們就可以把性質相似的服務類歸納成一個,很大程度上能簡化編碼.

          下面請看例子,我們有兩個領域對象類:
          Member類:
          package com.sitinspring.domain;

          import org.dom4j.Element;

          /**
           * 成員類
           * 
          @author sitinspring
           *
           * @date 2007-12-28
           
          */

          public class Member implements CanbeXmlElementable{
              
          // 成員名稱
              private String name;
              
              
          // 年齡    
              private int age;
              
              
          /**
               * 構造函數
               * 
          @param name
               * 
          @param age
               
          */

              
          public Member(String name,int age){
                  
          this.name=name;
                  
          this.age=age;
              }

              
              
          /**
               * 將Member實例轉化為XML中一個節點
               
          */

              
          public Element generateElement(Element parent){
                  Element elm
          =parent.addElement("member");
                  
                  Element nameElm
          =elm.addElement("name");    
                  nameElm.setText(name);
                  Element ageElm
          =elm.addElement("age");    
                  ageElm.setText(String.valueOf(age));
                  
                  
          return elm;
              }

              
              
          public String toString(){
                  
          return "Name="+name+" Age="+age;
              }


              
          public int getAge() {
                  
          return age;
              }


              
          public void setAge(int age) {
                  
          this.age = age;
              }


              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String name) {
                  
          this.name = name;
              }

          }

          公司類:
          package com.sitinspring.domain;

          import org.dom4j.Element;

          /**
           * 公司類
           * 
          @author sitinspring
           *
           * @date 2007-12-28
           
          */

          public class Company implements CanbeXmlElementable{
              
          // 公司名
              private String name;
              
              
          // 地址
              private String address;
              
              
          /**
               * 構造函數
               * 
          @param name
               * 
          @param address
               
          */

              
          public Company(String name,String address){
                  
          this.name=name;
                  
          this.address=address;
              }

              
              
          /**
               * 將Company類的實例轉化為XML的一個節點
               
          */

              
          public Element generateElement(Element parent){
                  Element elm
          =parent.addElement("company");
                  
                  Element nameElm
          =elm.addElement("name");    
                  nameElm.setText(name);
                  Element ageElm
          =elm.addElement("address");    
                  ageElm.setText(address);
                  
                  
          return elm;
              }

              
              
          public String toString(){
                  
          return "Company Name="+name+" Address="+address;
              }


              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String name) {
                  
          this.name = name;
              }


              
          public String getAddress() {
                  
          return address;
              }


              
          public void setAddress(String address) {
                  
          this.address = address;
              }

          }

          它們都實現了一個名為CanbeXmlElementable的接口:
          package com.sitinspring.domain;

          import org.dom4j.Element;

          /**
           * 接口,強制子類實現generateElement函數
           * 
          @author sitinspring
           *
           * @date 2007-12-28
           
          */

          public interface CanbeXmlElementable{
              
          /**
               * 用于把領域對象實例轉化為XML中一個節點
               * 
          @param parent
               * 
          @return
               
          */

              
          public Element generateElement(Element parent);
          }

          為什么要實現這個接口呢,下面就知道了.

          對這兩個對象需要實現集中管理和將集合存儲到XML文件中,現在我們可以用泛型類實現這兩個功能,下面看泛型類實現的新服務類:
          package com.sitinspring.service;

          import java.io.FileWriter;
          import java.util.ArrayList;
          import java.util.List;

          import org.dom4j.Document;
          import org.dom4j.DocumentHelper;
          import org.dom4j.Element;
          import org.dom4j.io.OutputFormat;
          import org.dom4j.io.XMLWriter;

          import com.sitinspring.domain.CanbeXmlElementable;

          /**
           * 服務類,持有對象的集合,負責對象的存儲
           * 
          @author sitinspring
           *
           * @date 2007-12-28
           
          */

          public class Service<extends CanbeXmlElementable>{
              
          private List<T> elements;
              
              
          /**
               * 添加集合元素
               * 
          @param element
               
          */

              
          public void add(T element){
                  
          if(elements==null){
                      elements
          =new ArrayList<T>();
                  }

                  
                  elements.add(element);
              }

              
              
          /**
               * 將集合保存成XML文件
               * 
          @param xmlFile
               
          */

              
          public void saveToXml(String xmlFile){
                  
          try{
                      Document document
          =DocumentHelper.createDocument();
                      Element root
          =document.addElement("elements");
                      
                      
          for(T t:elements){
                          t.generateElement(root);
                      }
                      
                      
                      OutputFormat format 
          = OutputFormat.createPrettyPrint();
                      format.setEncoding(
          "GBK");    // 指定XML編碼        
                      
                      XMLWriter writer 
          = new XMLWriter(new FileWriter(xmlFile),format);
                      writer.write(document);
                      writer.close();    
                  }

                  
          catch(Exception ex){
                      ex.printStackTrace();
                  }

              }

          }

          對于兩個領域對象的集合管理和XML持久化,使用這一個類就可以了,下面是測試代碼:
          package com.sitinspring;

          import com.sitinspring.domain.Company;
          import com.sitinspring.domain.Member;
          import com.sitinspring.service.Service;

          /**
           * 測試類
           * 
           * 
          @author sitinspring
           * 
           * @date 2007-12-28
           
          */

          public class Main {
              
          public static void main(String[] args) {
                  
          // 泛型類測試一
                  Service<Member> memberService = new Service<Member>();

                  memberService.add(
          new Member("Andy"25));
                  memberService.add(
          new Member("Bill"35));
                  memberService.add(
          new Member("Cindy"45));
                  memberService.add(
          new Member("Sitinspring"55));

                  memberService.saveToXml(
          "member.xml");

                  
          // 泛型類測試二
                  Service<Company> companyService = new Service<Company>();

                  companyService.add(
          new Company("IBM","NewYork"));
                  companyService.add(
          new Company("Microsoft""beijing"));
                  companyService.add(
          new Company("Google""Shanghai"));
                  companyService.add(
          new Company("Citigroup""Dalian"));

                  companyService.saveToXml(
          "company.xml");
              }

          }

          文件結果:
          member.xml:
          <?xml version="1.0" encoding="GBK"?>

          <elements>
            
          <member>
              
          <name>Andy</name>
              
          <age>25</age>
            
          </member>
            
          <member>
              
          <name>Bill</name>
              
          <age>35</age>
            
          </member>
            
          <member>
              
          <name>Cindy</name>
              
          <age>45</age>
            
          </member>
            
          <member>
              
          <name>Sitinspring</name>
              
          <age>55</age>
            
          </member>
          </elements>

          company.xml:
          <?xml version="1.0" encoding="GBK"?>

          <elements>
            
          <company>
              
          <name>IBM</name>
              
          <address>NewYork</address>
            
          </company>
            
          <company>
              
          <name>Microsoft</name>
              
          <address>beijing</address>
            
          </company>
            
          <company>
              
          <name>Google</name>
              
          <address>Shanghai</address>
            
          </company>
            
          <company>
              
          <name>Citigroup</name>
              
          <address>Dalian</address>
            
          </company>
          </elements>


          現在可以看出,以前使用多個類才能實現的功能在泛型類誕生后只需要一個類就可以了,它能高度歸納類的共性,減少功能相似類的數目,減少重復代碼,減輕了項目的復雜度,真的是"很好,很強大!".

          代碼下載:
          http://www.aygfsteel.com/Files/sitinspring/GenericPersistence20071228164755.rar

          如果你對泛型類不是很熟悉可以參考:
          http://www.aygfsteel.com/sitinspring/archive/2007/12/28/171212.html

           

          posted on 2007-12-28 16:47 sitinspring 閱讀(3649) 評論(2)  編輯  收藏 所屬分類: Object Orient Programming 、Java基礎

          評論

          # re: 使用泛型類簡化服務層(Service)類的設計 2007-12-28 17:59 zephyr

          你的這個Service感覺更像是DAO或是Repository.Service是包含領域邏輯的..難道所有的領域邏輯都一樣?  回復  更多評論   

          # re: 使用泛型類簡化服務層(Service)類的設計 2007-12-28 19:13 sitinspring

          @zephyr

          這個Service是舉個例子而已,集合和生成XML文件作為服務層的兩個功能的代表.
          有時候服務層還真是高度相似,雖然代碼有些許詫異,但功能都很雷同,泛型出來之前沒有什么好辦法.

            回復  更多評論   

          sitinspring(http://www.aygfsteel.com)原創,轉載請注明出處.
          主站蜘蛛池模板: 益阳市| 阿瓦提县| 台东县| 彰化市| 峨眉山市| 漳浦县| 凭祥市| 都昌县| 新龙县| 焉耆| 赫章县| 彭水| 铜山县| 宜章县| 新龙县| 宣恩县| 邵东县| 桂林市| 瑞昌市| 伊金霍洛旗| 双桥区| 浦县| 罗山县| 闻喜县| 特克斯县| 德钦县| 古蔺县| 苏尼特右旗| 宽城| 遂宁市| 巴林右旗| 巴青县| 凌海市| 诸城市| 台北县| 游戏| 三明市| 高要市| 汉寿县| 兴文县| 丹凤县|