??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产精品成人久久,亚洲成亚洲乱码一二三四区软件,校园亚洲春色另类小说合集http://www.tkk7.com/jsdk999/zh-cnMon, 12 May 2025 11:10:24 GMTMon, 12 May 2025 11:10:24 GMT60用JS实现的MAPc?/title><link>http://www.tkk7.com/jsdk999/archive/2006/12/01/84897.html</link><dc:creator>WindDC</dc:creator><author>WindDC</author><pubDate>Fri, 01 Dec 2006 09:24:00 GMT</pubDate><guid>http://www.tkk7.com/jsdk999/archive/2006/12/01/84897.html</guid><wfw:comment>http://www.tkk7.com/jsdk999/comments/84897.html</wfw:comment><comments>http://www.tkk7.com/jsdk999/archive/2006/12/01/84897.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.tkk7.com/jsdk999/comments/commentRss/84897.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jsdk999/services/trackbacks/84897.html</trackback:ping><description><![CDATA[ <p>本程序用JS写的一个类拟于JAVA中MAPc?可以寚w值对q行l护.<br /><br /><br />/*<br />name: (tng) (tng) (tng) Map.js<br />author: (tng) WindDC<br />date: (tng) (tng) (tng) 2006-10-27<br />content: 本程序用JS实现cLJAVA中MAP对像的功?br />*/</p> <p>function Node(key,value){//键值对对象<br /> (tng) (tng) (tng) this.key=key;<br /> (tng) (tng) (tng) this.value=value;<br />}</p> <p>function Map(){//Mapc?br /> (tng) (tng) (tng) this.nodes=new Array();<br />}</p> <p>Map.prototype.put=function(key,value){//往容器中加入一个键值对<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) for(var i=0;i<this.nodes.length;i++)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(this.nodes[i].key==key){//如果键值已存在Q则putҎ(gu)为更新已有数?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.nodes[i].value=value;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) var node=new Node(key,value);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.nodes.push(node);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) return;<br />}//put</p> <p> (tng) (tng) <br />Map.prototype.get=function(key){//获取指定键的?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) for(var i=0;i<this.nodes.length;i++)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(this.nodes[i].key==key)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return this.nodes[i].value;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) return null;<br />}//get<br /> (tng) (tng) (tng) (tng) <br />Map.prototype.size=function(){//获取容器中对象的个数<br /> (tng) (tng) (tng)  (tng)return this.nodes.length;<br />}//size</p> <p> (tng) (tng) (tng)  (tng) (tng) (tng) (tng) <br />Map.prototype.clear=function(){//清空容器<br /> (tng) (tng) (tng)  (tng)while(this.nodes.length>0)<br /> (tng) (tng) (tng)  (tng) (tng) (tng) this.nodes.pop(); (tng) (tng) (tng) (tng) (tng) <br />}//clear<br /> (tng)<br />Map.prototype.remove=function(key){//删除指定?br /> (tng) (tng) (tng)  (tng)for(var i=0;i<this.nodes.length;i++)<br /> (tng) (tng) (tng)  (tng) (tng) (tng) if(this.nodes[i].key==key){<br /> (tng) (tng) (tng)  (tng) (tng) (tng)  (tng) (tng) if(i>0)<br /> (tng) (tng) (tng)  (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) var nodes1=this.nodes.concat(this.nodes.slice(0,i-1),this.nodes.slice(i+1));<br /> (tng) (tng) (tng)  (tng) (tng) (tng) (tng) (tng) (tng) else//删除的是W一个元?br /> (tng) (tng) (tng)  (tng) (tng) (tng) (tng) (tng) (tng)  (tng) var nodes1=nodes.slice(1);<br /> (tng) (tng) (tng)  (tng) (tng) (tng) (tng) (tng) (tng) this.nodes=nodes1;</p> <p> (tng) (tng) (tng)  (tng) (tng) (tng) }<br />}//remove<br /><br /> (tng) (tng) (tng) <br />Map.prototype.isEmpty=function(){//是否为空<br /> (tng) (tng) (tng)  (tng)if(this.nodes.length==0)<br /> (tng) (tng) (tng)  (tng) (tng) return true;<br /> (tng) (tng) (tng)  (tng)else<br /> (tng) (tng) (tng)  (tng) (tng) return false;<br />}//isEmpty<br /> (tng) (tng) (tng) <br />Map.prototype.toString=function(){<br /> (tng) (tng) (tng) (tng) var str="[";<br /> (tng) (tng) (tng) (tng) for(var i=0;i<this.nodes.length;i++){<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(i<this.nodes.length-1)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) str=str+this.nodes[i].key+",";<br /> (tng) (tng) (tng) (tng) (tng) (tng) else<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) str=str+this.nodes[i].key; (tng) (tng) (tng) (tng)<br /> (tng) (tng)  (tng)}<br /> (tng) (tng) (tng) str=str+"]";<br /> (tng) (tng) (tng) (tng)return str;<br />}</p> <img src ="http://www.tkk7.com/jsdk999/aggbug/84897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jsdk999/" target="_blank">WindDC</a> 2006-12-01 17:24 <a href="http://www.tkk7.com/jsdk999/archive/2006/12/01/84897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net实现的数据库链接?/title><link>http://www.tkk7.com/jsdk999/archive/2006/12/01/84892.html</link><dc:creator>WindDC</dc:creator><author>WindDC</author><pubDate>Fri, 01 Dec 2006 09:11:00 GMT</pubDate><guid>http://www.tkk7.com/jsdk999/archive/2006/12/01/84892.html</guid><wfw:comment>http://www.tkk7.com/jsdk999/comments/84892.html</wfw:comment><comments>http://www.tkk7.com/jsdk999/archive/2006/12/01/84892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jsdk999/comments/commentRss/84892.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jsdk999/services/trackbacks/84892.html</trackback:ping><description><![CDATA[ <p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) 本文是用.net实现的数据库链接?大体体现?jin)数据库链接池的实现思想,ADO.NET已经提供?jin)很好的链接池维?所以本E序基本没有什么实用h(hun)?<br /><br />1.链接池管理类<br />using System;<br />using System.Data;<br />using System.Data.SqlClient;<br />using System.Data.OleDb;<br />using System.Collections;<br />using System.Configuration;</p> <p>/// <summary><br />/// DbConnectionPool 的摘要说?br />/// </summary></p> <p>namespace dbopr<br />{<br /> (tng) (tng) (tng) public class DbConnectionPool<br /> (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) //定义存放数据库链接的队列<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) private static Queue connections=new Queue();</p> <p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) //数据库参?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) private static string ConnString = ""; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //链接字符?/p> <p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) //链接池参?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) private static int InitSize = 20; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //初始化链接池大小<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) private static int MaxSize = 100; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //最大链接数<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) private static int QueueSize = 50; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //队列中最大维护的链接?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) private static int ConnNum = 0; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //pȝl护的链接L</p> <p> <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) //定义数据库类型,1表示为SqlServer数据库,2表示其它的OLE DBQ默认ؓ(f)SqlServer<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) private static int (tng) DbType = 1;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) public static int DbType<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) set<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) DbType = value;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }</p> <p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) private DbConnectionPool()<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) try{<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ConnString = Configuration.connectionStrings["DbSource"].connectionString;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) InitSize = int.Parse(Configuration.connectionStrings["InitSize"].connectionString);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) MaxSize = int.Parse(Configuration.connectionStrings["MaxSize"].connectionString);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) QueueSize = int.Parse(Configuration.connectionStrings["QueueSize"].connectionString);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) DbType = int.Parse(Configuration.connectionStrings["DbType"].connectionString);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) initPool();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) catch(Exception e) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) //初始化链接池<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) private static void initPool(){<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int i;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) for (i = 1; i <= InitSize; i++) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (DbType == 1)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) connections.Enqueue(newSqlConn());<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) connections.Enqueue(newOleConn());<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }</p> <p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) //获取一个Sql Server链接对象<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) private static SqlConnection newSqlConn()<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ConnNum++;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return new SqlConnection(ConnString);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) //获取一个OLE DB链接对像<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) private static OleDbConnection newOleConn() <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ConnNum++;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return new OleDbConnection(ConnString);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }</p> <p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) //获取一个数据库链接<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) public static IDbConnection getConn() {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (connections.Count == 0) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //如果队列中链接用完,则新Z个链接放入队?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (ConnNum > MaxSize) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //如果当前zd链接辑ֈ最大,则等待链?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return null;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (DbType == 1)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) connections.Enqueue(newSqlConn());<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) connections.Enqueue(newOleConn());<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return connections.Dequeue();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return connections.Dequeue();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }</p> <p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) //释放一个活q链?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) public static void reConn(IDbConnection conn) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (connections.Count > QueueSize) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //如果队列中元素个数已辑ֈ最大,则关闭链?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) conn.Close();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) connections.Enqueue(conn);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }</p> <p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) //销毁链接池<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) public static void ClearPool() {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) while(connections.Count>0)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (IDbConnection)connections.Dequeue().Close();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) }<br />}<br /><br />2.链接生成c?br />using System;<br />using System.Data;<br />using System.Data.SqlClient;<br />using System.Data.OleDb;<br />using System.Configuration;<br />using System.Web;</p> <p>/// <summary><br />/// DbConn 的摘要说?br />/// </summary></p> <p>namespace dbopr<br />{<br /> (tng) (tng) (tng) public class DbConnection<br /> (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) private static IDbConnection conn;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) public DbConnection()<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) // TODO: 在此处添加构造函数逻辑<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }</p> <p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) public static SqlConnection getSqlConn()<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //获取链接池中的Sql Server的链?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) conn = DbConnectionPool.getConn();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return (SqlConnection)conn;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }</p> <p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) public static OleDbConnection getOleConn() {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //获取其它OLE DB的链?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) conn = DbConnectionPool.getConn();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return (OleDbConnection)conn;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }</p> <p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) public static void Close() {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //攑֛用过的链?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) DbConnectionPool.reConn(conn);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) }<br />}</p> <img src ="http://www.tkk7.com/jsdk999/aggbug/84892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jsdk999/" target="_blank">WindDC</a> 2006-12-01 17:11 <a href="http://www.tkk7.com/jsdk999/archive/2006/12/01/84892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>看到一遍好文章啊,大家分n下!--抽象cd接口的用场?/title><link>http://www.tkk7.com/jsdk999/archive/2006/09/22/71274.html</link><dc:creator>WindDC</dc:creator><author>WindDC</author><pubDate>Fri, 22 Sep 2006 03:32:00 GMT</pubDate><guid>http://www.tkk7.com/jsdk999/archive/2006/09/22/71274.html</guid><wfw:comment>http://www.tkk7.com/jsdk999/comments/71274.html</wfw:comment><comments>http://www.tkk7.com/jsdk999/archive/2006/09/22/71274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jsdk999/comments/commentRss/71274.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jsdk999/services/trackbacks/71274.html</trackback:ping><description><![CDATA[abstract class和interface是Java语言中对于抽象类定义q行支持的两U机Ӟ正是׃q两U机制的存在Q才赋予?jin)Java强大的面向对象能力?abstract class和interface之间在对于抽象类定义的支持方面具有很大的怼性,甚至可以怺替换Q因此很多开发者在q行抽象cd义时对于 abstract class和interface的选择昑־比较随意。其实,两者之间还是有很大的区别的Q对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意囄理解是否正确、合理。本文将对它们之间的区别q行一番剖析,试图l开发者提供一个在二者之间进行选择的依据?br /><br />理解抽象c?br /><br />abstract class和interface在Java语言中都是用来进行抽象类Q本文中的抽象类q从abstract class译而来Q它表示的是一个抽象体Q而abstract class为Java语言中用于定义抽象类的一U方法,误者注意区分)(j)定义的,那么什么是抽象c,使用抽象c能为我们带来什么好处呢Q?br /><br />在面向对象的概念中,我们知道所有的对象都是通过cL描绘的,但是反过来却不是q样。ƈ不是所有的c都是用来描l对象的Q如果一个类中没有包含够的信息来描l(sh)个具体的对象Q这L(fng)cd是抽象类。抽象类往往用来表征我们在对问题领域q行分析、设计中得出的抽象概念,是对一pd看上M同,但是本质上相同的具体概念的抽象。比如:(x)如果我们q行一个图形编辑Y件的开发,׃(x)发现问题领域存在着圆、三角Şq样一些具体概念,它们是不同的Q但是它们又都属于Ş状这样一个概念,形状q个概念在问题领域是不存在的Q它?yu)是一个抽象概c(din)正是因为抽象的概念在问题领域没有对应的具体概念Q所以用以表征抽象概늚抽象cL不能够实例化的?br /><br />在面向对象领域,抽象cM要用来进行类型隐藏。我们可以构造出一个固定的一l行为的抽象描述Q但是这l行为却能够有Q意个可能的具体实现方式。这个抽象描q就是抽象类Q而这一lQ意个可能的具体实现则表现为所有可能的zcR模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允怿改的Q同Ӟ通过从这个抽象体zQ也可扩展此模块的行为功能。熟(zhn)OCP的读者一定知道,Z(jin)能够实现面向对象设计的一个最核心(j)的原则OCP(Open-Closed Principle)Q抽象类是其中的关键所在?br /><br />从语法定义层面看abstract class和interface<br /><br />在语法层面,Java语言对于abstract class和interfacel出?jin)不同的定义方式Q下面以定义一个名为Demo的抽象类Z来说明这U不同?br /><br />使用abstract class的方式定义Demo抽象cȝ方式如下Q?br /><br />abstract class Demo ?br />abstract void method1();<br />abstract void method2();<br />?br />?br /><br />使用interface的方式定义Demo抽象cȝ方式如下Q?br /><br />interface Demo {<br />void method1();<br />void method2();<br />?br />}<br /><br />在abstract class方式中,Demo可以有自q数据成员Q也可以有非abstarct的成员方法,而在interface方式的实CQDemo只能够有?rn)态的不能被修改的数据成员Q也是必须是static final的,不过在interface中一般不定义数据成员Q,所有的成员Ҏ(gu)都是abstract的。从某种意义上说Qinterface是一U特DŞ式的abstract class?br /><br />从编E的角度来看Qabstract class和interface都可以用来实现design by contract的思想。但是在具体的用上面还是有一些区别的?br /><br />首先Qabstract class在Java语言中表C的是一U(h)承关p,一个类只能使用一ơ(h)承关pR但是,一个类却可以实现多个interface。也许,q是Java语言的设计者在考虑Java对于多重l承的支持方面的一U折?sh)考虑吧?br /><br />其次Q在abstract class的定义中Q我们可以赋予方法的默认行ؓ(f)。但是在interface的定义中Q方法却不能拥有默认行ؓ(f)Qؓ(f)?jin)绕q这个限Ӟ必须使用委托Q但是这?增加一些复杂性,有时?x)造成很大的麻?ch)?br /><br />在抽象类中不能定义默认行存在另一个比较严重的问题Q那是可能?x)造成l护上的ȝ(ch)。因为如果后来想修改cȝ界面Q一般通过abstract class或者interface来表C)(j)以适应新的情况Q比如,d新的Ҏ(gu)或者给已用的方法中d新的参数Q时Q就?x)非常的ȝ?ch)Q可能要p很多的时_(d)对于zcd多的情况Q尤为如此)(j)。但是如果界面是通过abstract class来实现的Q那么可能就只需要修改定义在abstract class中的默认行ؓ(f)可以了(jin)?br />同样Q如果不能在抽象cM定义默认行ؓ(f)Q就?x)导致同L(fng)Ҏ(gu)实现出现在该抽象cȝ每一个派生类中,q反?one ruleQone place原则Q造成代码重复Q同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小?j)?br /><br />从设计理念层面看abstract class和interface<br /><br />上面主要从语法定义和~程的角度论qC(jin)abstract class和interface的区别,q些层面的区别是比较低层ơ的、非本质的。本节从另一个层面:(x)abstract class和interface所反映出的设计理念Q来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概늚本质所在?br /><br />前面已经提到q,abstarct class在Java语言中体C(jin)一U(h)承关p,要想使得l承关系合理Q父cdzcM间必d在is a关系Q即父类和派生类在概忉|质上应该是相同的Q参考文献?〕中有关于is a关系的大幅深入的论qͼ有兴的读者可以参考)(j)。对于interface 来说则不?dng)q不要求interface的实现者和interface定义在概忉|质上是一致的Q仅仅是实现?jin)interface定义的契U而已。ؓ(f)?jin)便于理解Q下面将通过一个简单的实例q行说明?br /><br />考虑q样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Doorh执行两个动作open和closeQ此时我们可以通过abstract class或者interface来定义一个表C抽象概念的类型,定义方式分别如下所C:(x)<br /><br />使用abstract class方式定义DoorQ?br /><br />abstract class Door {<br />abstract void open();<br />abstract void close()Q?br />}<br />使用interface方式定义DoorQ?br />interface Door {<br />void open();<br />void close();<br />}<br />其他具体的Doorcd可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看h好像使用abstract class和interface没有大的区别?br />如果现在要求Doorq要h报警的功能。我们该如何设计针对该例子的cȝ构呢Q在本例中,主要是ؓ(f)?jin)展Cabstract class和interface反映在设计理念上的区别,其他斚w无关的问题都做了(jin)化或者忽略)(j)Q下面将|列出可能的解决Ҏ(gu)Qƈ从设计理念层面对q些不同的方案进行分析?br /><br />解决Ҏ(gu)一Q?br />单的在Door的定义中增加一个alarmҎ(gu)Q如下:(x)<br />abstract class Door {<br />abstract void open();<br />abstract void close()Q?br />abstract void alarm();<br />}<br />或?br />interface Door {<br />void open();<br />void close();<br />void alarm();<br />}<br /><br />那么h报警功能的AlarmDoor的定义方式如下:(x)<br /><br />class AlarmDoor extends Door {<br />void open() { ?}<br />void close() { ?}<br />void alarm() { ?}<br />}<br />或?br />class AlarmDoor implements Door ?br />void open() { ?}<br />void close() { ?}<br />void alarm() { ?}<br />?br />q种Ҏ(gu)q反?jin)面向对象设计中的一个核?j)原则ISPQInterface Segregation PricipleQ,在Door的定义中把Door概念本n固有的行为方法和另外一个概忉|警器的行为方法؜在了(jin)一赗这样引L(fng)一个问题是那些仅仅依赖于Doorq个概念的模块会(x)因ؓ(f)报警器这个概늚改变Q比如:(x)修改alarmҎ(gu)的参敎ͼ(j)而改变,反之依然?br /><br />解决Ҏ(gu)二:(x)<br />既然open、close和alarm属于两个不同的概念,Ҏ(gu)ISP原则应该把它们分别定义在代表q两个概늚抽象cM。定义方式有Q这两个概念都?abstract class方式定义Q两个概念都使用interface方式定义Q一个概念用abstract class方式定义Q另一个概念用interface方式定义?br /><br />昄Q由于Java语言不支持多重(h)承,所以两个概念都使用abstract class方式定义是不可行的。后面两U方式都是可行的Q但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意囄反映是否正确、合理。我们一一来分析、说明?br /><br />如果两个概念都用interface方式来定义,那么反映出两个问题Q?、我们可能没有理解清楚问题领域,AlarmDoor在概忉|质上到底?Doorq是报警器?2、如果我们对于问题领域的理解没有问题Q比如:(x)我们通过对于问题领域的分析发现AlarmDoor在概忉|质上和Door是一致的Q那么我们在实现时就没有能够正确的揭C我们的设计意图Q因为在q两个概늚定义上(均用interface方式定义Q反映不Zq含义?br /><br />如果我们对于问题领域的理解是QAlarmDoor在概忉|质上是DoorQ同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢Q前面已l说q,abstract class在Java语言中表CZU(h)承关p,而(h)承关pd本质上是is a关系。所以对于Doorq个概念Q我们应该用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行ؓ(f)Q所以报警概念可以通过interface方式定义。如下所C:(x)<br /><br />abstract class Door {<br />abstract void open();<br />abstract void close()Q?br />}<br />interface Alarm {<br />void alarm();<br />}<br />class AlarmDoor extends Door implements Alarm {<br />void open() { ?}<br />void close() { ?}<br />void alarm() { ?}<br />}<br />q种实现方式基本上能够明的反映出我们对于问题领域的理解Q正的揭示我们的设计意图。其实abstract class表示的是is a关系Qinterface表示的是like a关系Q大家在选择时可以作Z个依据,当然q是建立在对问题领域的理解上的,比如Q如果我们认为AlarmDoor在概忉|质上是报警器Q同时又h Door的功能,那么上述的定义方式就要反q来?jin)?br />l论<br />abstract class和interface是Java语言中的两种定义抽象cȝ方式Q它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概忉|质的理解、对于设计意囄反映是否正确、合理,因ؓ(f)它们表现?jin)概念间的不同的关系Q虽焉能够实现需求的功能Q。这其实也是语言的一U的惯用法,希望读者朋友能够细l体?x)?br /><br />很多人有q这L(fng)疑问Qؓ(f)什么有的地方必M用接口而不是抽象类Q而在另一些地方,又必M用抽象类而不是接口呢Q或者说Q在考虑Javacȝ一般化问题Ӟ很多Z(x)在接口和抽象cM间犹豫不冻I甚至随便选择一U?br /><br />  实际上接口和抽象cȝ选择不是随心(j)所Ʋ的?要理解接口和抽象cȝ选择原则Q有两个概念很重要:(x)对象的行为和对象的实现。如果一个实体可以有多种实现方式Q则在设计实体行为的描述方式Ӟ应当辑ֈq样一个目标:(x)在用实体的时候,无需详细?jin)解实体行?f)的实现方式。也是_(d)要把对象的行为和对象的实现分d来。既然Java的接口和抽象c都可以定义不提供具体实现的Ҏ(gu)Q在分离对象的行为和对象的实现时Q到底应该用接口还是用抽象类呢?<br /><br />通过抽象cd立行为模?br /><br />  在接口和抽象cȝ选择上,必须遵守q样一个原则:(x)行ؓ(f)模型应该L通过接口而不是抽象类定义。ؓ(f)?jin)说明其原因Q下面试着通过抽象cd立行为模型,看看?x)出C么问题?br /><br />  假设要ؓ(f)销售部门设计一个YӞq个软g包含一个“发动机”(MotorQ实体。显然无法在发动机对象中详细地描q发动机的方斚w面,只能描述某些对当前Y件来说重要的特征。至于发动机的哪些特征是重要的,则要与用P销售部门)(j)交流才能定?br /><br />  销售部门的求每一个发动机都有一个称为马力的参数。对于他们来_(d)q是惟一值得兛_(j)的参数。基于这一判断Q可以把发动机的行ؓ(f)定义Z下行为?br /><br />  行ؓ(f)1Q查询发动机的马力,发动机将q回一个表C马力的整数?br /><br />  虽然现在q(sh)清楚发动机如何取得马力这个参敎ͼ但可以肯定发动机一定支持这个行为,而且q是所有发动机惟一值得x(chng)的行为特征。这个行为特征既可以用接口定义,也可以用抽象cd义。ؓ(f)?jin)说明用抽象cd义可能出现的问题Q下面用抽象cd立发动机的行为模型,q用JavaҎ(gu)描述行ؓ(f)1Q代码如下:(x)<br /><br />public abstract Motor{<br /><br />abstract public int getHorsepower();<br /><br />}<br /><br />  在Motor抽象cȝ基础上构造出多种具体实现Q例如A型发动机、B型发动机{,再加上系l的其它部分Q最后得?.0版的软gq交付(sh)用。一D|间过M(jin)Q现在要设计2.0版的软g。在评估2.0版Y仉求的q程中,发现一部分发动机是电(sh)池驱动的Q而电(sh)池需要一定的充电(sh)旉。销售部门的人希望能够通过计算机查阅充甉|间。根据这一要求定义一个新的行为,如图1所C?br /><br />  行ؓ(f)2Q查询电(sh)驱动发动机的充电(sh)旉Q发动机返回一个表C充甉|间的整数?br /><br />  用JavaҎ(gu)来描q这个行为,代码如下Q?br /><br />public abstract BatteryPoweredMotor extends Motor{<br /><br />abstract public int getTimeToRecharge();<br /><br />}<br /><br />  在销售部门的软g中,?sh)驱动发动机也以cȝ形式实现Q但q些cMBatteryPoweredMotor而不是Motorz。这些改动加入到2.0版Y件之后,销售部门很满意。随着业务的不断发展,不久之后光驱动的发动机出C(jin)。销售部门要求光驱动发动机需要一定光能才能运转,光能以流明(LumenQ度量。这个信息对客户很重要,因ؓ(f)下雨或多云的天气里,某些光驱动发动机可能无法q{。销售部门要求ؓ(f)软g增加对光驱动发动机的支持Q所以要定义一个新的行为?br /><br />  行ؓ(f)3Q查询光驱动发动够正常运转所需要的最流明数Q发动机q回一个整数?br /><br />  再定义一个抽象类q把行ؓ(f)3转换成JavaҎ(gu)Q代码如下:(x)<br /><br />public abstract SolarPoweredMotor extends Motor{<br /><br />abstract public int getLumensToOperate();<br /><br />}<br /><br />  如图1所C,SolarPoweredMotor和BatteryPoweredMotor都从Motor抽象cL生。在整个软g中,90Q以上的代码以相同的方式对待所有的发动机。偶?dng)需要检查一下发动机是光驱动q是?sh)驱动,使用instanceof实现Q代码如下:(x)<br /><br />[color=#336600]<br /><br />if (instanceof SolarPoweredMotor){...}<br /><br />if (instanceof BatteryPoweredMotor){...}<br /><br />  无论是哪U发动机Q马力这个参数都很重要,所以在所有派生的抽象c(SolarPoweredMotor和BatteryPoweredMotorQ中QgetHorsepower()Ҏ(gu)都有效?br /><br />  现在销售部门又有了(jin)一U新的发动机Q它是一U既有电(sh)驱动又有光驱动的双重驱动发动机。光驱动和电(sh)驱动的行为本w没有变化,但新的发动机同时支持两种行ؓ(f)。在考虑如何定义新型的光?sh)驱动发动机Ӟ接口和抽象类的差别开始显C出来了(jin)。新的目标是在增加新型发动机的前提下量改动代码。因Z光驱动发动机、电(sh)驱动发动机有关的代码已经q全面的试Q不存在已知的Bug。ؓ(f)?jin)增加光电(sh)驱动发动机Q要定义一个新的SolarBatteryPowered抽象cR如果让SolarBatteryPowered从Motor抽象cL生,SolarBatteryPowered不支持针对光驱动发动机和电(sh)驱动发动机的instanceof操作。也是_(d)如果查询一个光?sh)驱动的发动机是光驱动的Q还是电(sh)驱动的,得到的答案是Q都不是?br /><br />  如果?SolarBatteryPowered从SolarPoweredMotorQ或BatteryPoweredMotorQ抽象类zQ类似的问题?sh)?x)出现QSolarBatteryPowered不支持针对BatteryPoweredMotorQ或SolarPoweredMotorQ的 instanceof操作。从行ؓ(f)上看Q光?sh)驱动的发动机必d时从两个抽象cL生,但Java语言不允许多重(h)ѝ之所以会(x)出现q个问题Q根本的原因在于使用抽象cM仅意味着定义特定的行为,而且意味着定义实现的模式。也是_(d)应该定义一个发动机如何获得行ؓ(f)的模型,而不仅仅是声明发动机h某一个行为?br /><br />通过接口建立行ؓ(f)模型<br /><br />  如果用接口来建立行ؓ(f)模型Q就可以避免隐含地规定实现模式。例如,前面的几个行为改用接口定义如下?br /><br />  行ؓ(f)1Q?br /><br />public interface Motor(){<br /><br />public int getHorsepower();<br /><br />}<br /><br />行ؓ(f)2Q?br /><br />public interface BatteryPoweredMotor extends Motor(){<br /><br />public int getTimeToRecharge();<br /><br />}<br /><br />行ؓ(f)3Q?br /><br />public interface SolarPoweredMotor extends Motor{<br /><br />abstract public int getLumensToOperate();<br /><br />}<br /><br />  现在光电(sh)驱动的发动机可以描述为:(x)<br />public DualPoweredMotor implements SolarPoweredMotor, BatteryPoweredMotor{}<br /><br />  DualPoweredMotor只(h)承行为定义,而不是行为的实现模式Q如?所C?br /><br />  在用接口的同时仍旧可以使用抽象c,不过q时抽象cȝ作用是实现行为,而不是定义行为。只要实现行为的c遵从接口定义,即它改变(sh)(jin)父抽象类Q也不用改变其它代码与之交互的方式。特别是对于公用的实C码,抽象cL它的优点。抽象类能够保证实现的层ơ关p,避免代码重复。然而,即在用抽象类的场合,也不要忽视通过接口定义行ؓ(f)模型的原则。从实践的角度来看,如果依赖于抽象类来定义行为,往往Dq于复杂的(h)承关p,而通过接口定义行ؓ(f)能够更有效地分离行ؓ(f)与实玎ͼZ码的l护和修改带来方ѝ?img src ="http://www.tkk7.com/jsdk999/aggbug/71274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jsdk999/" target="_blank">WindDC</a> 2006-09-22 11:32 <a href="http://www.tkk7.com/jsdk999/archive/2006/09/22/71274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://ghiearning.com" target="_blank">һ</a>| <a href="http://haiholr.com" target="_blank">ѳߵӰ</a>| <a href="http://606059.com" target="_blank">ģƵ</a>| <a href="http://weisuoshu.com" target="_blank">˳վձƬ</a>| <a href="http://simupiao.com" target="_blank">91ƷѲ߹ۿ</a>| <a href="http://gg596gg.com" target="_blank">þþ97ɫ</a>| <a href="http://kyqp0022.com" target="_blank">ŷպëƬ߿վ</a>| <a href="http://paweax.com" target="_blank">޹һ</a>| <a href="http://cjsyw123.com" target="_blank">ѹ˦Ƭ</a>| <a href="http://taiyu18.com" target="_blank">һ24޹˾</a>| <a href="http://yuntao360.com" target="_blank">37pao˹Ƶ</a>| <a href="http://caocl1024liu.com" target="_blank">ۺϾþ123</a>| <a href="http://9ts9.com" target="_blank">޾þһح</a>| <a href="http://mt569.com" target="_blank">޾Ʒ</a>| <a href="http://www-006688.com" target="_blank">պƬӰѹۿ</a>| <a href="http://sznsfe.com" target="_blank">ƷŮͬһѲ</a>| <a href="http://hzsprfm.com" target="_blank">㽶Ʒ鶹</a>| <a href="http://trgod.com" target="_blank"> ɫһ վ</a>| <a href="http://qmoread.com" target="_blank">޹Ʒþþϼ2 </a>| <a href="http://vvv75.com" target="_blank">ɫAAVѲ</a>| <a href="http://blbkl.com" target="_blank">ɫͼ߹ۿ</a>| <a href="http://gkhnf.com" target="_blank">ѹۿİ</a>| <a href="http://4922000.com" target="_blank">һ</a>| <a href="http://whyandroid.com" target="_blank">avһ</a>| <a href="http://a8g8.com" target="_blank">av벻߹ۿ</a>| <a href="http://91ggan.com" target="_blank">߳ëƬڵƵ</a>| <a href="http://56p6.com" target="_blank">޹Ʒר߹ۿ</a>| <a href="http://mtsp2.com" target="_blank">պѸƵ</a>| <a href="http://j2eesp.com" target="_blank">av˾Ʒһ</a>| <a href="http://8833655.com" target="_blank">һ߲ </a>| <a href="http://jimeng-99.com" target="_blank">޹Ʒþ66</a>| <a href="http://126cm.com" target="_blank">߹ۿѵһ</a>| <a href="http://igdytt.com" target="_blank">Ʒ޾Ʒ2021</a>| <a href="http://2222jjjj.com" target="_blank">һƵ</a>| <a href="http://tbw77.com" target="_blank">þþþþëƬѲ</a>| <a href="http://aizaicc.com" target="_blank">123</a>| <a href="http://meinvtaotu.com" target="_blank">Ļ˾þ</a>| <a href="http://bcz123.com" target="_blank">**aaaaaëƬ</a>| <a href="http://fz166.com" target="_blank">**ɫëƬѹۿ</a>| <a href="http://zfjhw.com" target="_blank">޹˾þ77</a>| <a href="http://wwwwmmmm.com" target="_blank">ŷ޾þav</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>