昨天晚上,我的老师(算是我的亲戚)给了我一段代码,让我看看。现copy如下:
1、CitySingleton.cs文件代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.IO;
using System.Xml;
/// <summary>
/// CitySingleton 的摘要说明
/// </summary>
public class CitySingleton
{
List<City> _cities = null;
private static CitySingleton _instance;
private CitySingleton()
{
_cities = new List<City>();
//装载所有站点的数据
LoadData();
}
/// <summary>
/// 获取单例
/// </summary>
public static CitySingleton Instance
{
get
{
if (_instance == null)
{
_instance = new CitySingleton();
}
return _instance;
}
}
/// <summary>
/// 重新装载数据
/// </summary>
public void ReloadData()
{
_cities.Clear();
LoadData();
}
/// <summary>
/// 装载数据
/// </summary>
private void LoadData()
{
//打开风力的配置文件
string filename = HttpContext.Current.Server.MapPath(@"~/XML/Cities.xml");
FileInfo file = new FileInfo(filename);
if (file.Exists)
{
try
{
XmlDocument xml = new XmlDocument();
xml.Load(filename);
//获取风力的节点
XmlNodeList cities = xml.SelectNodes(@"/Cities/City");
if (cities.Count > 0)
{
foreach (XmlNode city in cities)
{
if (city.HasChildNodes)
{
//将数据保存到WindLevel中
City c = new City();
foreach (XmlNode field in city)
{
switch (field.Name.Trim())
{
case "CityName":
c.CityName = field.InnerText.Trim();
break;
case "Longitude":
c.Longitude = (float)Double.Parse(field.InnerText.Trim());
break;
case "Latitude":
c.Latitude = (float)Double.Parse(field.InnerText.Trim());
break;
case "Zoom":
c.Zoom = (float)Double.Parse(field.InnerText.Trim());
break;
case "TextDirection":
c.TextDirection = field.InnerText.Trim();
break;
default:
break;
}
}
_cities.Add(c);
}
}
}
}
catch
{
}
}
}
/// <summary>
/// 返回符合条件的城市列表
/// 放大
/// </summary>
/// <param name="zoom"></param>
/// <returns></returns>
public List<City> GetCities(float zoom)
{
List<City> cities = new List<City>();
for (int i = 0; i < _cities.Count; i++)
{
City c = _cities[i];
if (c.Zoom >= zoom)
{
cities.Add(c);
}
}
return cities;
}
}
2、City.cs文件代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/// <summary>
/// City 的摘要说明
/// </summary>
public class City
{
string _cityname = "";
float _longitude = 0;
float _latitude = 0;
float _zoom = 0;
string _textdirection = "";
//与台风的距离,在显示测距时用
float _distance = 0;
public City()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
/// <summary>
/// 城市名称
/// </summary>
public string CityName
{
get { return _cityname; }
set { _cityname = value; }
}
/// <summary>
/// 城市经度
/// </summary>
public float Longitude
{
get { return _longitude; }
set { _longitude = value; }
}
/// <summary>
/// 城市纬度
/// </summary>
public float Latitude
{
get { return _latitude; }
set { _latitude = value; }
}
/// <summary>
/// 地图放大因子
/// </summary>
public float Zoom
{
get { return _zoom; }
set { _zoom = value; }
}
/// <summary>
/// 文字方向
/// </summary>
public string TextDirection
{
get { return _textdirection; }
set { _textdirection = value; }
}
/// <summary>
/// 与台风之间的距离
/// </summary>
public float Distance
{
get { return _distance; }
set { _distance = value; }
}
}
3、Cities.xml文件代码:
<?xml version="1.0" encoding="utf-8" ?>
<Cities>
<City>
<CityName>广州</CityName>
<Longitude>113.287047</Longitude>
<Latitude>23.17691</Latitude>
<Zoom>50</Zoom>
<TextDirection>TOP</TextDirection>
</City>
<City>
<CityName>深圳</CityName>
<Longitude>114.045941</Longitude>
<Latitude>22.626807</Latitude>
<Zoom>50</Zoom>
<TextDirection>RIGHT</TextDirection>
</City>
<City>
<CityName>香港</CityName>
<Longitude>114.156</Longitude>
<Latitude>22.373</Latitude>
<Zoom>50</Zoom>
<TextDirection>BOTTOM</TextDirection>
</City>
<City>
<CityName>江门</CityName>
<Longitude>112.965032</Longitude>
<Latitude>22.569499</Latitude>
<Zoom>50</Zoom>
<TextDirection>LEFT</TextDirection>
</City>
</Cities>
源代码在这里了,现在说说,为什么要用这段代码:
首先说说单例模式,顾名思义,就是只能有一个实例,事实上单例模式有三点:
一是某个类只能有一个实例,不能new一个实例;二是它必须自行创建这个实例,当然是这类自身里;三是它必须自行向整个系统提供这个实例。至于什么情况需要使用单例模式,我现在也不是很懂。
本段程序主要是实现从XML文件中提取信息到相关的类,从而实现类的封装,高类聚低耦合,也就是面向对象OO编程的部分应用。具体怎样可以copy去调试,记得如果要实现它,需要在Default.aspx.cs文件中调用:
protected void Page_Load(object sender, EventArgs e)
{
CitySingleton city = CitySingleton.Instance;
………………
………………
………………
后面的类怎么用,如果你看懂了,我想你应该知道怎么调试,怎么用了(记得断点调试,我是最近才学会用断点调试的噢)。
}
这段代码就是单例模式的实现
private static CitySingleton _instance;
private CitySingleton()
{
_cities = new List<City>();
//装载所有站点的数据
LoadData();
}
/// <summary>
/// 获取单例
/// </summary>
public static CitySingleton Instance
{
get
{
if (_instance == null)
{
_instance = new CitySingleton();
}
return _instance;
}
}
PS:欢迎讨论,大家相互学习指教。QQ:153941061 E-mail:yangkunlisi@qq.com