??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品不卡一区,欧美高清在线一区二区,日韩亚洲视频http://www.aygfsteel.com/chaocai/category/8363.htmlzh-cnTue, 27 Feb 2007 12:16:36 GMTTue, 27 Feb 2007 12:16:36 GMT60依赖注入QDependency InjectionQ模式的特点分析与实?/title><link>http://www.aygfsteel.com/chaocai/articles/34913.html</link><dc:creator>越巅峰</dc:creator><author>越巅峰</author><pubDate>Sun, 12 Mar 2006 07:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/chaocai/articles/34913.html</guid><wfw:comment>http://www.aygfsteel.com/chaocai/comments/34913.html</wfw:comment><comments>http://www.aygfsteel.com/chaocai/articles/34913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chaocai/comments/commentRss/34913.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chaocai/services/trackbacks/34913.html</trackback:ping><description><![CDATA[<P align=center><B><SPAN>依赖注入Q?/SPAN><SPAN lang=EN-US>Dependency Injection</SPAN></B><B><SPAN>Q?/SPAN></B><B><SPAN>模式的特点分析与实现</SPAN></B><B></B></P> <P align=center><B><SPAN>――构造子注入</SPAN></B><B><SPAN>Q?/SPAN></B><B><SPAN lang=EN-US>Constructor Injection</SPAN></B><B><SPAN>Q?/SPAN></B><B><SPAN>模式的分析与实现</SPAN></B><B></B></P> <P align=center><B><SPAN lang=EN-US></SPAN></B> </P> <P align=center><B><SPAN lang=EN-US></SPAN></B> </P> <P align=center><SPAN>?/SPAN><SPAN lang=EN-US><SPAN>  </SPAN><SPAN>?/SPAN></P> <P align=center><SPAN>Q?/SPAN><SPAN lang=EN-US>chaocai2001@yahoo.com.cn</SPAN><SPAN>Q?/SPAN></P> <P align=center><SPAN lang=EN-US></SPAN> </P> <P><B><SPAN>摘要</SPAN></B><SPAN>Q本文对</SPAN><SPAN lang=EN-US>IoC</SPAN><SPAN>模式、依赖注?/SPAN><SPAN lang=EN-US>(Dependency Injection) </SPAN><SPAN>模式做了要介l,文中分析构造子注入模式与其他模式相比较的优势和特点Qƈl出了在</SPAN><SPAN lang=EN-US>JAVA</SPAN><SPAN>中实现该模式的方法?/SPAN></P> <P><SPAN lang=EN-US></SPAN> </P> <P><SPAN lang=EN-US></SPAN> </P> <H1><SPAN lang=EN-US><SPAN>1<SPAN>         </SPAN></SPAN><SPAN>引言</SPAN></H1> <P><SPAN lang=EN-US>IoC</SPAN><SPAN>Q?/SPAN><SPAN lang=EN-US>Inversion of Control</SPAN><SPAN>Q模式以被目前的轻量U容器所q泛应用Q通过</SPAN><SPAN lang=EN-US>IoC</SPAN><SPAN>模式q些容器帮助开发者将来自不同目的组件装配成一个内聚的应用E序。轻量?/SPAN><SPAN lang=EN-US>IoC</SPAN><SPAN>容器Q如</SPAN><SPAN lang=EN-US>Spring</SPAN><SPAN>?/SPAN><SPAN lang=EN-US>pico-container</SPAN><SPAN>Q虽然ؓ我们的开发提供了很大的便利,但是在很多情况下q些轻量U容器所提供的功能ƈ不一定非帔R合我们的需要,也许q些容器的功能过于庞大了Q或者所提供的功能缺乏对特定应用的针Ҏ,或者我们需要更高的q行效率Q这时我们可以在了解</SPAN><SPAN lang=EN-US>IoC</SPAN><SPAN>的原理的基础上利?/SPAN><SPAN lang=EN-US>JAVA</SPAN><SPAN>的反机制自己实现灵zȝ、可扩展的组件机制?/SPAN></P> <H1><SPAN lang=EN-US><SPAN>2<SPAN>         </SPAN></SPAN><SPAN lang=EN-US>IoC</SPAN><SPAN>与依赖注入(</SPAN><SPAN lang=EN-US>Dependency Injection</SPAN><SPAN>Q模式简?/SPAN></H1> <P><SPAN>?/SPAN><SPAN lang=EN-US>GoF</SPAN><SPAN>的设计模式相同,</SPAN><SPAN lang=EN-US>IoC</SPAN><SPAN>模式同样是关注重用性,但与</SPAN><SPAN lang=EN-US>GoF</SPAN><SPAN>模式不同的是</SPAN><SPAN lang=EN-US>IoC</SPAN><SPAN>模式更加x二进制的重用性和可扩展性,卛_以直接通过二进制q行扩充Q复用的模块通常被称为组件或者插Ӟlg和插仉是在q行时进行装载的?/SPAN></P> <P><SPAN lang=EN-US>GoF</SPAN><SPAN>的设计模式中我们大量看到的是面向接口~程Q?/SPAN><SPAN lang=EN-US>Interface Driven Design </SPAN><SPAN>接口驱动Q接口驱动有很多好处Q可以提供不同灵zȝ子类实现Q增加代码稳定和健壮性等{,但是接口一定是需要实现的Q也是如下语句q早要执行:</SPAN></P> <P><SPAN lang=EN-US>AInterface a = new AInterfaceImp(); </SPAN></P> <P><SPAN>׃以上的代码被写入了调用者程序中Q同时象</SPAN><SPAN lang=EN-US>AinterfaceImp</SPAN><SPAN>q样的接口的实现cL在编译时被装载的Q如果以后想加入新的接口实现cd必须修改调用者的代码?/SPAN></P> <P><SPAN lang=EN-US>IoC</SPAN><SPAN>模式与以上情况不同,接口的实现类是在q行时被装蝲的,q样即以后新添加了接口实现cL也不需修改调用者的代码Q可以通过特定的方式来定位新增的实现类Q如配置文g指定Q?/SPAN><SPAN lang=EN-US>IoC</SPAN><SPAN>英文?/SPAN><SPAN lang=EN-US> Inversion of Control</SPAN><SPAN>Q即反{模式Q这里有著名的好莱坞理论Q你呆着别动Q到时我会找你?/SPAN></P> <P><SPAN lang=EN-US>IoC</SPAN><SPAN>模式可以延缓接口的实玎ͼҎ需要实玎ͼ有个比喻Q接口如同空的模型套Q在必要Ӟ需要向模型套注石膏,q样才能成ؓ一个模型实体,因此Q?/SPAN><SPAN>对于q些新生的容器,它们反{的是“如何定位插件的具体实现”。因此,</SPAN><SPAN> </SPAN><SPAN lang=EN-US>Martin Fowler</SPAN><SPAN lang=EN-US> </SPAN><SPAN>l这U模式v了一个Ş象的名称</SPAN><SPAN>“依赖注入?/SPAN><SPAN>Q?/SPAN><SPAN lang=EN-US>Dependency Injection</SPAN><SPAN>Q?/SPAN><SPAN>?INPUT class="" id=Image1 title="" type=image src="http://chaocai.cnblogs.com/Files/chaocai/1.jpg" value=Image1><BR></SPAN></P> <P></P> <P align=center><SPAN>图表</SPAN> <SPAN lang=EN-US><SPAN><SPAN>1</SPAN> </SPAN><SPAN>采用</SPAN><SPAN lang=EN-US>Dependency Injection</SPAN><SPAN>前后的依赖关pd?/SPAN></P> <P><SPAN>依赖注入的Ş式主要有三种Q分别将它们叫做构造子注入Q?/SPAN><SPAN lang=EN-US>Constructor Injection</SPAN><SPAN>Q、设值方法注入(</SPAN><SPAN lang=EN-US>Setter Injection</SPAN><SPAN>Q和接口注入Q?/SPAN><SPAN lang=EN-US>Interface Injection</SPAN><SPAN>Q?/SPAN></P> <P><SPAN>q三U方式在<SPAN lang=EN-US>Martin Fowler的?/SPAN><SPAN lang=EN-US>Inversion of Control Containers and the Dependency Injection pattern</SPAN><SPAN>》中都给Z详细的定义及说明Q本文就不再赘述了,下面的内容将着重介l?/SPAN><SPAN>构造子注入模式的特点及实现Ҏ?/SPAN></P> <H1><SPAN lang=EN-US><SPAN>3<SPAN>         </SPAN></SPAN><SPAN>构造子注入模式的特点及实现</SPAN></H1> <H2><SPAN lang=EN-US><SPAN>3.1<SPAN>      </SPAN></SPAN><SPAN>构造子注入模式的特?/SPAN></H2> <P><SPAN>通常情况下设</SPAN><SPAN>?/SPAN><SPAN>Ҏ注入和接口注入较易于被开发h员接受,而构造子注入则应用较,实际上构造子注入h很多其他两者所不具有的优势Q?/SPAN></P> <P><SPAN lang=EN-US>1 </SPAN><SPAN>构造子注入形成了一U更强的依赖契约</SPAN></P> <P><SPAN lang=EN-US>2 </SPAN><SPAN>可以获得更加明的代码</SPAN></P> <P><SPAN lang=EN-US>3 </SPAN><SPAN>更加明的依赖声明机制Q无d?/SPAN><SPAN lang=EN-US>XML</SPAN><SPAN>配置文g或设</SPAN><SPAN>?/SPAN><SPAN>Ҏ</SPAN></P> <P><SPAN lang=EN-US>4 </SPAN><SPAN>更加W合接口与实现分ȝlg特征Q组件接口表明能够向其它lg提供的服务,而实现则应该是所提供服务的实现应该与服务契约无关Q即不应包含用于获得依赖的设值方法等Q?/SPAN></P> <P><SPAN lang=EN-US>5 </SPAN><SPAN>不会出现不确定的状态。在讑ր方法注入中Q由于ƈ不是所有的讑ր方法(</SPAN><SPAN lang=EN-US>setter</SPAN><SPAN>Q都一定会被调用的Q所以会有不定状态?/SPAN></P> <P><SPAN>从以上几Ҏ们还可以分析出构造子注入对于lg代码的入侉|远于其它两种模式</SPAN><SPAN lang=EN-US>(</SPAN><SPAN>接口注入使得lg必须实现特定接口Q设值方法同栯求组件提供特定的</SPAN><SPAN lang=EN-US>setter</SPAN><SPAN>Ҏ</SPAN><SPAN lang=EN-US>)</SPAN><SPAN>Q代码更加易于维?/SPAN><SPAN>?INPUT class="" id=Image2 title="" type=image src="http://chaocai.cnblogs.com/Files/chaocai/2.jpg" value=Image2></SPAN></P> <P align=center></P> <P align=center><SPAN>图表</SPAN> <SPAN lang=EN-US><SPAN><SPAN>2</SPAN> </SPAN><SPAN>CZ中类的关p?/SPAN></P> <P><SPAN lang=EN-US>Client</SPAN><SPAN>的实C赖于接口</SPAN><SPAN lang=EN-US>A</SPAN><SPAN>?/SPAN><SPAN lang=EN-US>B</SPAN><SPAN>?/SPAN><SPAN lang=EN-US>C</SPAN><SPAN>的实玎ͼ但是Z提供pȝ更好的灵zL和可扩展性,各接口的实现以组件的方式利用</SPAN><SPAN lang=EN-US>java</SPAN><SPAN>的反机制进行运行时装蝲Q注意到lg间可能会存在某种依赖关系Q例如组?/SPAN><SPAN lang=EN-US>AX</SPAN><SPAN>依赖与接?/SPAN><SPAN lang=EN-US>B</SPAN><SPAN>的实现类Q而这中依赖关pddq行时动态注入,lgZ告诉lg的调用者这U依赖关pM便注入,可以使用上文提到的各U模式:</SPAN></P> <P><SPAN lang=EN-US>1 </SPAN><SPAN>使用接口注入模式</SPAN></P> <P><SPAN lang=EN-US>public interface InjectB{</SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>public void injectB(B bImp);</SPAN></P> <P><SPAN lang=EN-US>}</SPAN></P> <P><SPAN lang=EN-US>public interface InjectC{</SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>public void injectC(C cImp);</SPAN></P> <P><SPAN lang=EN-US>}</SPAN></P> <P><SPAN lang=EN-US>public class AImp implements A,InjectB,InjectC{</SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>?/SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>public void injectB(B bImp);</SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>public void injectC(C cImp);</SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>?/SPAN></P> <P><SPAN lang=EN-US>}</SPAN></P> <P><SPAN lang=EN-US>2 </SPAN><SPAN>使用讑ր注入模?/SPAN></P> <P><SPAN lang=EN-US>public class AImp implements A {</SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>?/SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>public void setB(B bImp);</SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>public void setC(C cImp);</SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>?/SPAN></P> <P><SPAN lang=EN-US>}</SPAN></P> <P><SPAN lang=EN-US></SPAN> </P> <P><SPAN lang=EN-US>3 </SPAN><SPAN>使用构造子注入模式</SPAN></P> <P><SPAN lang=EN-US>public class AImp implements A {</SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>?/SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>public AImp(B bImp, C cImp){</SPAN></P> <P><SPAN lang=EN-US><SPAN>              </SPAN>?/SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>}</SPAN></P> <P><SPAN lang=EN-US><SPAN>       </SPAN>?/SPAN></P> <P><SPAN lang=EN-US>}</SPAN></P> <P><SPAN>׃上实例可以清楚的看出采用构造子注入模式的实现组件代码最为简单,且所受的入R性最?/SPAN></P> <H2><SPAN lang=EN-US><SPAN>3.2<SPAN>      </SPAN></SPAN><SPAN>?/SPAN><SPAN lang=EN-US>JAVA</SPAN><SPAN>中实现构造子注入模式</SPAN></H2> <P><SPAN>?/SPAN><SPAN lang=EN-US>java</SPAN><SPAN>?/SPAN><SPAN lang=EN-US>.NET</SPAN><SPAN>q样h反射功能的语a中实现类型的q行时蝲入ƈ不复杂,只要通过</SPAN><SPAN lang=EN-US>Class.forName</SPAN><SPAN>或生成自q</SPAN><SPAN lang=EN-US>ClassLoader</SPAN><SPAN>可以实现?/SPAN></P> <P><SPAN>同样我们可以通过反射机制获取lg构造函数的参数Q注入相应接口的实现Q作者将此过E进行了装Q以下是代码Q?/SPAN></P> <P><SPAN lang=EN-US>public class RefectHelper {</SPAN></P> <P><SPAN lang=EN-US><SPAN>         </SPAN>public Object ConstructorHelper(String className,ConstructorParamDeal pd) throws Exception{</SPAN></P> <P><SPAN lang=EN-US><SPAN>                   </SPAN>try{</SPAN></P> <P><SPAN lang=EN-US><SPAN>                            </SPAN>//</SPAN><SPAN>获取cM的构造函?/SPAN></P> <P><SPAN lang=EN-US>Constructor[] constructs=Class.forName(className).getConstructors();<SPAN>              </SPAN>//</SPAN><SPAN>实现中默认用第一个构造函数类创徏实例</SPAN><SPAN lang=EN-US><SPAN>       </SPAN></P> <P><SPAN lang=EN-US><SPAN>                            </SPAN>Class [] classes=constructs[0].getParameterTypes();<SPAN>                   </SPAN></P> <P><SPAN lang=EN-US><SPAN>         </SPAN><SPAN>       </SPAN><SPAN>              </SPAN>//</SPAN><SPAN>获取要注入的参数实例</SPAN></P> <P><SPAN lang=EN-US><SPAN>                            </SPAN>Object []obj=pd.dealParam(classes);</SPAN></P> <P><SPAN lang=EN-US><SPAN>                            </SPAN>//</SPAN><SPAN>创徏实例</SPAN></P> <P><SPAN lang=EN-US><SPAN>                            </SPAN>return constructs[0].newInstance(obj);</SPAN></P> <P><SPAN lang=EN-US><SPAN>                   </SPAN>}catch(Exception e){</SPAN></P> <P><SPAN lang=EN-US><SPAN>                            </SPAN>throw e;</SPAN></P> <P><SPAN lang=EN-US><SPAN>                   </SPAN>}</SPAN></P> <P><SPAN lang=EN-US><SPAN>                   </SPAN></P> <P><SPAN lang=EN-US><SPAN>                   </SPAN></P> <P><SPAN lang=EN-US><SPAN>         </SPAN>}</SPAN></P> <P><SPAN lang=EN-US>}</SPAN></P> <P><SPAN lang=EN-US>/**</SPAN></P> <P><SPAN lang=EN-US>*</SPAN><SPAN>构造函数参数注?/SPAN></P> <P><SPAN lang=EN-US>**/</SPAN></P> <P><SPAN lang=EN-US>public interface ConstructorParamDeal {</SPAN></P> <P><SPAN lang=EN-US><SPAN>         </SPAN>/**</SPAN></P> <P><SPAN lang=EN-US><SPAN>         </SPAN>*</SPAN><SPAN>Ҏ构造函C参数的类型注?/SPAN><SPAN lang=EN-US>,</SPAN><SPAN>相应的实?/SPAN></P> <P><SPAN lang=EN-US><SPAN>         </SPAN>@param classes </SPAN><SPAN>构造函数的参数cd</SPAN></P> <P><SPAN lang=EN-US><SPAN>         </SPAN><SPAN>?/SPAN><SPAN lang=EN-US>return </SPAN><SPAN>注入构造函数的参数实现</SPAN></P> <P><SPAN lang=EN-US><SPAN>         </SPAN>**/</SPAN></P> <P><SPAN lang=EN-US><SPAN>         </SPAN>public Object [] dealParam(Class [] classes);</SPAN></P> <P><SPAN lang=EN-US>}</SPAN></P> <P><SPAN lang=EN-US>public class ParamDeal implements ConstructorParamDeal{</SPAN></P> <P><SPAN lang=EN-US></SPAN> </P> <P><SPAN lang=EN-US><SPAN>         </SPAN>/* (non-Javadoc)</SPAN></P> <P><SPAN lang=EN-US><SPAN>         </SPAN><SPAN> </SPAN>* @see com.topsec.tsm.agent.helper.ConstructorParamDeal#dealParam(java.lang.Class[])</SPAN></P> <P><SPAN lang=EN-US><SPAN>         </SPAN><SPAN> </SPAN>*/</SPAN></P> <P><SPAN lang=EN-US><SPAN>         </SPAN>public Object [] dealParam(Class[] classes) {</SPAN></P> <P><SPAN lang=EN-US><SPAN>                   </SPAN>Object [] obj=new Object[classes.length];</SPAN></P> <P><SPAN lang=EN-US><SPAN>                   </SPAN>for (int i=0;i<obj.length;i++){</SPAN></P> <P><SPAN lang=EN-US><SPAN>                            </SPAN>//</SPAN><SPAN>Z同类型注入选择不同实例</SPAN></P> <P><SPAN lang=EN-US><SPAN>                            </SPAN>if (classes[i].equals(String.class)){</SPAN></P> <P><SPAN lang=EN-US><SPAN>                                     </SPAN>obj[i]=”Hello World?<SPAN>                                        </SPAN></P> <P><SPAN lang=EN-US><SPAN>                            </SPAN>}</SPAN></P> <P><SPAN lang=EN-US><SPAN>                   </SPAN>}</SPAN></P> <P><SPAN lang=EN-US><SPAN>                   </SPAN>return obj;</SPAN></P> <P><SPAN lang=EN-US><SPAN>         </SPAN>}</SPAN></P> <P><SPAN lang=EN-US></SPAN> </P> <P><SPAN lang=EN-US>}</SPAN></P> <P><SPAN>上面的程序中</SPAN><SPAN lang=EN-US>ConstructorHelper</SPAN><SPAN>用于利用反射机制枚D入类的构造函数及构造函数的参数的类型,至于不同cd注入什么样的实例则?/SPAN><SPAN lang=EN-US>ContructorParamDeal</SPAN><SPAN>的实现者来军_Q?/SPAN><SPAN lang=EN-US>ContructorParamDeal</SPAN><SPAN>的实现者同样可以以lg的Ş式在q行时动态蝲入。由于组仉的依赖关pȝ制约Q所以组件实例化的顺序需要特别考虑?/SPAN></P> <H1><SPAN lang=EN-US><SPAN>4<SPAN>         </SPAN></SPAN><SPAN>l束?/SPAN></H1> <P><SPAN>三种依赖注入模式各有其特点和优势Q只有充分理解这些模式间的不同,才能q应用选择正确的依赖注入模式,文中介绍的构造子注入模式实现ҎQ在使用其他h反射功能的语aQ如Q?/SPAN><SPAN lang=EN-US>.NET</SPAN><SPAN>Q时同样可以参考?/SPAN></P> <P><SPAN lang=EN-US></SPAN> </P> <P><SPAN lang=EN-US></SPAN> </P> <P><SPAN lang=EN-US></SPAN> </P> <P><B><SPAN lang=EN-US><SPAN> </SPAN>[</SPAN></B><B><SPAN>参考文?/SPAN></B><B><SPAN lang=EN-US>]</SPAN></B></P> <P><SPAN lang=EN-US>1 </SPAN><SPAN lang=EN-US>Martin Fowler,Inversion of Control Containers and the Dependency Injection pattern,<A ><SPAN>http://www.martinfowler.com/articles/injection.html</SPAN></A>,2004</SPAN></P> <P><SPAN lang=EN-US>2 Erich Gamma,Design Patterns,Addison Wesley,1999</SPAN></P> <P><SPAN lang=EN-US>3 <A ><SPAN>http://www.picocontainer.org/</SPAN></A></SPAN></P> <P><SPAN lang=EN-US>4 </SPAN><SPAN lang=EN-US><A ><SPAN>彭晨?/SPAN></A>,</SPAN><SPAN lang=EN-US>Ioc</SPAN><SPAN>模式</SPAN><SPAN lang=EN-US>,</SPAN><SPAN lang=EN-US> http://www.jdon.com,2004</SPAN></P></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><img src ="http://www.aygfsteel.com/chaocai/aggbug/34913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chaocai/" target="_blank">越巅峰</a> 2006-03-12 15:50 <a href="http://www.aygfsteel.com/chaocai/articles/34913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ˳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˼é</a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ݰ</a>| <a href="http://" target="_blank">٤ʦ</a>| <a href="http://" target="_blank">߰</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ұ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ɽ</a>| <a href="http://" target="_blank">ʯ¥</a>| <a href="http://" target="_blank">Ӣ</a>| <a href="http://" target="_blank">ػ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">찲</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ֹ</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>