Java設計模式模式 (包括工廠模式xml解析)

wangdongli_1993發表於2018-07-09

設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的,設計模式使程式碼編制真正工程化,設計模式是軟體工程的基石,如同大廈的一塊塊磚石一樣。專案中合理的運用設計模式可以完美的解決很多問題,每種模式在現在中都有相應的原理來與之對應,每一個模式描述了一個在我們周圍不斷重複發生的問題,以及該問題的核心解決方案,這也是它能被廣泛應用的原因。簡單說:

模式:在某些場景下,針對某類問題的某種通用的解決方案。

1.單例設計模式

  懶漢式

  餓漢式

  double checking

 詳見博文https://blog.csdn.net/wangdongli_1993/article/details/80972188

2.代理模式

        現實生活中的代理(比如租房子張中介代理,那麼你是真實角色,是你要租房子,而中介公式是代理角色,你們有共同的約定),代理模式要求真實角色和代理角色實現同一個介面。

         第二種執行緒建立方式  執行緒類實現Runnable介面,執行緒類就是真實角色。Thread是代理角色,也實現了Runnable介面,這就是代理模式,由Thread類中的start(),代理你完成執行緒的啟動呼叫

3.工廠模式

在手寫伺服器時,學到的解析xml語言就用到工廠模式,解析xml語言,學習了基於流的SAX解析方式  對於xml檔案內容,一條一條的分析。

這是一個簡單的xml檔案,寫入了兩個Person物件,要解析,要有對應的Person類

<?xml version="1.0" encoding="utf-8" ?>
<persons>
<person>
<name>"嫦娥"</name>
<age>9000</age>
</person>
<person>
<name>"豬八戒"</name>
<age>10100</age>
</person>
</persons>

所以,定義Person類,一個簡單的JAVABEAN類

package xml;
public class Person {

private String name;
private int age;
public Person(){
}
public Person(String name, int age) {
super();
this.name = name;
this.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;
}

}

寫xml解析類

package xml;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

/**
 * 繼承DefaultHandler類,重寫五個方法
 * startDocument() 
 * startElement(String uri, String localName, String qName,
Attributes attributes) 
qName 就是xml檔案中的成對的標籤名稱
characters(引數) 對成對標籤的中的值進行獲取,
 * endElement(引數)  endDocument()
 * @author Administrator
 *
 */

public class PersonHandler extends DefaultHandler{
private List<Person> persons;
private Person person;
private String tag;
@Override
public void startDocument() throws SAXException {
//System.out.println("處理文件開始");
persons=new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("處理元素開始"+qName);
if(qName!=null){
tag=qName;
}
if(qName!=null&&qName.equals("person")){
person=new Person();
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String str=new String(ch,start,length);
if(tag!=null&&tag.equals("name")){
person.setName(str);
}
else if(tag!=null&&tag.equals("age")){
person.setAge(Integer.valueOf(str));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("處理一個元素結束"+qName);
if(qName!=null&&qName.equals("person"))
{
persons.add(person);
}
tag=null;
}
@Override
public void endDocument() throws SAXException {
//System.out.println("處理文件結束");
}

public List<Person> getPersons() {
return persons;
}

public void setPersons(List<Person> persons) {
this.persons = persons;
}
}
最後是應用,處理xml檔案

package xml;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

//工廠模式

public class ParseDemo01 {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

    // 獲取解析工廠  SAXParserFactory 抽象類 .newInstance()建立物件

SAXParserFactory factory=SAXParserFactory.newInstance();

   //從解析工廠獲取解析器 

SAXParser parse=factory.newSAXParser();

//載入文件  註冊處理器  獲取xml檔案

Thread.currentThread().getContextClassLoader().
getResourceAsStream("xml/Person.xml")
//編寫處理器  就是上面寫好的解析類

PersonHandler ph=new PersonHandler();
parse.parse(Thread.currentThread().getContextClassLoader().
getResourceAsStream("xml/Person.xml"), ph);
List<Person> persons=ph.getPersons();
for(Person p:persons){
System.out.println(p.getName()+"--->"+p.getAge());
}
}
}



相關文章