我的漫漫程序之旅

          專注于JavaWeb開發(fā)
          隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
          數(shù)據(jù)加載中……

          用泛型類簡化服務(wù)層類的設(shè)計(jì)

          領(lǐng)域?qū)宇惪梢岳斫鉃槌绦蜻\(yùn)行時(shí)數(shù)據(jù)流的功能單位,而服務(wù)層類是為領(lǐng)域?qū)宇愄峁┓?wù)的,常見的服務(wù)有增刪改查等操作,在沒有泛型之前,我們只能采用一個(gè)服務(wù)類為一個(gè)領(lǐng)域類提供服務(wù)的方案,如果說服務(wù)的性質(zhì)類似,如都是增刪改查等,則代碼的功能重復(fù)性很高,維護(hù)起來也很麻煩.如果采用了泛型類,我們就可以把性質(zhì)相似的服務(wù)類歸納成一個(gè),很大程度上能簡化編碼.

          下面請看例子,我們有兩個(gè)領(lǐng)域?qū)ο箢?
          Member類:
          package domain;

          import
           org.dom4j.Element;

          /**
           * 成員類
           * 
           * 
          @author zdw
           * 
           
          */

          public class Member implements CanbeXmlElementtable
          {
              
          private
           String name;
              
          private int
           age;

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


              
          /**
               * 將Member實(shí)例轉(zhuǎn)化為XML中一個(gè)節(jié)點(diǎn)
               
          */

              
          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 String getName()
              
          {
                  
          return
           name;
              }


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


              
          public int getAge()
              
          {
                  
          return
           age;
              }


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


          }


          公司類:
          package domain;

          import
           org.dom4j.Element;

          /**
           * 公司類
           * 
          @author zdw
           *
           
          */

          public class Company implements CanbeXmlElementtable
          {
              
          //公司名

              private String name;
              
          //地址

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

              
          /*
               * 將Company類的實(shí)例轉(zhuǎn)化為XML的一個(gè)節(jié)點(diǎn)
               
          */

              
          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;
              }

              
              @Override
              
          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;
              }


          }

          它們都實(shí)現(xiàn)了一個(gè)名為CanbeXmlElementable的接口:
          package domain;

          import
           org.dom4j.Element;
          /**
           * 接口,強(qiáng)制子類實(shí)現(xiàn)generateElement函數(shù)
           * 
          @author zdw
           *
           
          */

          public interface CanbeXmlElementtable
          {
              
          public
           Element generateElement(Element parent);
          }

          為什么要實(shí)現(xiàn)這個(gè)接口呢,下面就知道了.
          對這兩個(gè)對象需要實(shí)現(xiàn)集中管理和將集合存儲到XML文件中,現(xiàn)在我們可以用泛型類實(shí)現(xiàn)這兩個(gè)功能,下面看泛型類實(shí)現(xiàn)的新服務(wù)類:
          package domain;

          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;
          /*
           * 服務(wù)類,持有對象的集合,負(fù)責(zé)對象的存儲
           
          */

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

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

                  elements.add(element);
              }

              
          /*
               * 將集合保存成xml文件
               
          */

              
          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();;
                      
          //指定xml編碼

                      format.setEncoding("GBK");
                      XMLWriter writer 
          = new XMLWriter(new
           FileWriter(xmlFile),format);
                      writer.write(document);
                      writer.close();
                  }
           catch (Exception e)
                  
          {
                      e.printStackTrace();
                  }

              }

          }


          對于兩個(gè)領(lǐng)域?qū)ο蟮募瞎芾砗蚗ML持久化,使用這一個(gè)類就可以了,下面是測試代碼:
          package domain;

          public class
           Main
          {

              
          /**
               * 
          @param args
               
          */

              
          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(
          "src/domain/member.xml"
          );
                  
          //泛型類測試二

                  Service<Company> companyService = new Service<Company>();
                  
                  companyService.add(
          new Company("IBM","New York"
          ));
                  companyService.add(
          new Company("Microsoft","beijing York"
          ));
                  companyService.add(
          new Company("Google","Shanghai"
          ));
                  companyService.add(
          new Company("Citigroup","Dalian"
          ));
                  companyService.saveToXml(
          "src/domain/company.xml"
          );
              }


          }

          文件結(jié)果:
          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>New York</address>
            
          </company>
            
          <company>
              
          <name>Microsoft</name>
              
          <address>beijing York</address>
            
          </company>
            
          <company>
              
          <name>Google</name>
              
          <address>Shanghai</address>
            
          </company>
            
          <company>
              
          <name>Citigroup</name>
              
          <address>Dalian</address>
            
          </company>
          </elements>
          現(xiàn)在可以看出,以前使用多個(gè)類才能實(shí)現(xiàn)的功能在泛型類誕生后只需要一個(gè)類就可以了,它能高度歸納類的共性,減少功能相似類的數(shù)目,減少重復(fù)代碼,減輕了項(xiàng)目的復(fù)雜度,真的是"很好,很強(qiáng)大!".



          posted on 2008-01-02 10:27 々上善若水々 閱讀(676) 評論(0)  編輯  收藏 所屬分類: JavaWeb

          主站蜘蛛池模板: 华安县| 高尔夫| 汽车| 阳东县| 南充市| 新干县| 米脂县| 灌南县| 通海县| 泸定县| 阿图什市| 苗栗市| 贵南县| 横山县| 安远县| 甘孜县| 佛山市| 临安市| 河津市| 延川县| 武宣县| 上高县| 阜平县| 米易县| 包头市| 巴青县| 五河县| 府谷县| 无锡市| 益阳市| 定边县| 铜山县| 昭平县| 西宁市| 江阴市| 沂南县| 济阳县| 利川市| 平昌县| 小金县| 永川市|