用泛型類簡化服務(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<T 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)大!".
下面請看例子,我們有兩個(gè)領(lǐng)域?qū)ο箢?
Member類:





























































公司類:











































































對這兩個(gè)對象需要實(shí)現(xiàn)集中管理和將集合存儲到XML文件中,現(xiàn)在我們可以用泛型類實(shí)現(xiàn)這兩個(gè)功能,下面看泛型類實(shí)現(xiàn)的新服務(wù)類:























































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





























member.xml:










































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