Bootstrap

Java设计模式模式 (包括工厂模式xml解析)

设计模式(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());
}
}
}



;