??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲免费福利视频,亚洲人成色777777精品,久久亚洲成a人片http://m.tkk7.com/43880800/category/17388.htmlzh-cnMon, 03 Dec 2007 21:49:55 GMTMon, 03 Dec 2007 21:49:55 GMT60Java反射学习(fn)http://m.tkk7.com/43880800/archive/2007/12/04/165045.htmlTomTomMon, 03 Dec 2007 16:55:00 GMThttp://m.tkk7.com/43880800/archive/2007/12/04/165045.htmlhttp://m.tkk7.com/43880800/comments/165045.htmlhttp://m.tkk7.com/43880800/archive/2007/12/04/165045.html#Feedback0http://m.tkk7.com/43880800/comments/commentRss/165045.htmlhttp://m.tkk7.com/43880800/services/trackbacks/165045.htmlJava反射学习(fn)       所谓反,可以理解为在q行时期获取对象cd信息的操作。传l的~程Ҏ(gu)要求E序员在~译阶段军_使用的类型,但是在反的帮助下,~程人员可以动态获取这些信息,从而编写更加具有可UL性的代码。严格地_反射q~程语言的特性,因ؓ在Q何一U语a都可以实现反机Ӟ但是如果~程语言本n支持反射Q那么反的实现׃方便很多?

1Q获得类型类
    我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接承自ObjectcRObjectcM包含一个方法名叫getClassQ利用这个方法就可以获得一个实例的cdcR类型类指的是代表一个类型的c,因ؓ一切皆是对象,cd也不例外Q在Java使用cdcL表示一个类型。所有的cdc都是Classcȝ实例。例如,有如下一D代码:
A a = new A();
if(a.getClass()==A.class)
    System.out.println("equal");
else System.out.println("unequal");

    可以看到Q对象a是A的一个实例,A某一个类Q在if语句中用a.getClass()q回的结果正是A的类型类Q在Java中表CZ个特定类型的cdcd以用“cd.class”的方式获得,因ؓa.getClass()获得是A的类型类Q也是A.classQ因此上面的代码执行的结果就是打印出“equal”。特别注意的是,cdcL一一对应的,父类的类型类和子cȝcdcL不同的,因此Q假设A是B的子c,那么如下的代码将得到“unequal”的输出:
A a = new A();
if(a.getClass()==B.class)
    System.out.println("equal");
else System.out.println("unequal");

    因此Q如果你知道一个实例,那么你可以通过实例?#8220;getClass()”Ҏ(gu)获得该对象的cdc,如果你知道一个类型,那么你可以?#8220;.class”的方法获得该cd的类型类?br />    
2Q获得类型的信息
    在获得类型类之后Q你可以调用其中的一些方法获得类型的信息了,主要的方法有Q?br /> getName():StringQ获得该cd的全U名U?br /> getSuperClass():ClassQ获得该cd的直接父c,如果该类型没有直接父c,那么q回null?br /> getInterfaces():Class[]Q获得该cd实现的所有接口?br /> isArray():booleanQ判断该cd是否是数l?br /> isEnum():booleanQ判断该cd是否是枚丄型?br /> isInterface():booleanQ判断该cd是否是接口?br /> isPrimitive():booleanQ判断该cd是否是基本类型,x否是intQbooleanQdouble{等?br /> isAssignableFrom(Class cls):booleanQ判断这个类型是否是cdcls的父Q祖先)cLӞ先Q接口?br /> getComponentType():ClassQ如果该cd是一个数l,那么q回该数l的lgcd?br /> 此外q可以进行类型{换这cȝ操作Q主要方法有Q?br /> asSubclass(Class clazz):ClassQ将q个cd转换至clazzQ如果可以{换,那么Lq回clazzq个引用Q否则抛出异常?br /> cast(Object obj):ObjectQ将obj强制转换个类型类代表的类型,不能转换的话抛出异常?/span>

    除了q些以外Q利用类型类q可以反该cd中的所有属性和Ҏ(gu)。在Java中所有的属性信息都用Field表示Q所有的Ҏ(gu)信息都用Method表示Q这辆各c都是java.lang.reflect包中的类。在Class中提供了4个相关的Ҏ(gu)获得cd的属性:
getField(String name):Field
getFields():Field[]
getDeclaredField(String name):Field
getDeclaredFields():Field[]
其中getField用于q回一个指定名U的属性,但是q个属性必L公有的,q个属性可以在父类中定义。如果是U有属性或者是保护属性,那么都会抛出异常提示找不到这个属性。getFields则是q回cd中的所有公有属性,所有的U有属性和保护属性都找不到。getDeclaredField获得在这个类型的声明中定义的指定名称的属性,q个属性必L在这个类型的声明中定义,但可以ɿU有和保护的。getDeclaredFields获得在这个类型的声明中定义的所有属性,包括U有和保护的属性都会被q回Q但是所有父cȝ属性都不会被返回。D个例子,先考虑下面两个cȝ声明Q?br /> class A extends B {
    public int a1;
    private int a2;
}
class B {
 public int b1;
 private int b2;
}
如果利用A的类型类调用getFieldsQ那么会q回a1和b1两个属性,如果调用getField("a2")则会报错Q如果调用getDeclaredFields则会q回a1和a2Q如果调用getDeclaredField("b1")则会报错?/span>

    对于Ҏ(gu)也有cM的函数即Q?br /> getMethods():Method[]
getMethod(String name, Class ... parameterTypes):Method
getDeclaredMethods():Method[]
getDeclaredMethod(Strubg name, Class ...parameterTypes):Method
不定长参?..是JDK5.0以后新加入的语法。这几个Ҏ(gu)的用法和上面的类|只是在获得特定方法时Q除了要告知Ҏ(gu)的名字,q需要告知方法的参数Q如果没有参敎ͼ那么可以传递nullQ或者空数组Q但是最好的Ҏ(gu)是什么都不写Q编译器会自行解决不定长参数问题?br />     如果要获得所有的属性(Ҏ(gu)Q,包括公有和私有的Q那么就必须利用getDeclareFieldsQgetDeclareMethodsQ方法,然后再利用getSuperClass的方法获得父c,然后递归下去?br />    
3Q属性和Ҏ(gu)
    所有的属性都使用Field表示Q所有的Ҏ(gu)都用Method表示。利用Field和Method可以获得属性和Ҏ(gu)的信息,甚至执行是获取、修改属性值和调用Ҏ(gu)?br />    
    对于属性,主要有以下方法可以用:
getType():ClassQ获得该属性的cd?br /> getName():StringQ获得属性名U?br /> isAccessible():booleanQ判断该属性是否是可以讉K的,通常U有和保护的cd都是不可以访问的?br /> get(Object obj):ObjectQ获得实例obj的属性|如果该实例的cd中不包含q个属性,那么׃报错?br /> set(Object obj, Object value)Q设|该实例的属性?br /> setAccessible(boolean flag)Q设|该属性是否可以访问,如果你调用get和setҎ(gu)Q那么有可能会引发访问权限的错误Q这个时候你可以调用setAccessibleҎ(gu)使得该属性可以访问。例如下面的代码Q?br /> A a = new A();
Field f = A.class.getDeclaredField("a2");
f.setAccessibe(true);
System.out.println(f.get(a));
f.set(a,12);
System.out.println(f.get(a));
如果Ud中间的f.setAccessibe(true);那么代码会报错,反之输出0 12?br />     对于属性而言Q如果该属性的cd是基本类型,那么q可以用一些便L(fng)set和get操作Q例如getIntQsetInt什么的Q你可以Ҏ(gu)自己的需要调用相应的Ҏ(gu)?br />    
    对于Ҏ(gu)Q可以有以下的方法:
getName():StringQ获得方法的名字?br /> getReturnType():ClassQ获得方法的q回值类型?br /> getParameterTypes():Class[]Q获得方法的参数cd?br /> isAccessible():booleanQ判断该Ҏ(gu)是否是可以访问的?br /> setAccessible(boolean flag)Q设|该Ҏ(gu)是否可以讉K?br /> invoke(Object obj, Object... args):ObjectQ调用实例obj的相应方法,其参数由argsl定Q如果没有参数那么可以什么都不写?br /> getExceptionTypes():Class[]Q获得该Ҏ(gu)可能抛出的异常类cd?br /> q几个方法的含义和用法都和Field的类|q里不再赘述?/span>

4Q创建实?br />     利用Class对象可以创徏一个类型的实例。如果一个类型拥有无参数的构造函敎ͼ那么可以单地调用Class.newInstance()Ҏ(gu)创徏一个实例。如果该cd没有无参数的构造函敎ͼ或者你希望是用某个有参数的构造函敎ͼ那么可以首先使用getConstructors()、getConstructor(Class[] parameterTypes)和getDeclaredConstructors()、getDeclaredConstructor(Class[] parameterTypes)获得构造函敎ͼq两个方法的q回值都使Constructorcd。特别注意的是,构造函C能承,因此你调用getConstructor也只能返回这个类型中定义的所有公有构造函数?br />    
    Constructor的用方法和Method的类|它也存在getParameterTypes()Ҏ(gu)和getExceptionTypes()Ҏ(gu)Q不同的是,它用newInstance(Object... args)来调用一个构造函敎ͼ注意newInstance不需要实例对象,因ؓq个时候你q没创徏出来q个实例呢?/span>



Tom 2007-12-04 00:55 发表评论
]]>
栈与?de 区别http://m.tkk7.com/43880800/archive/2007/08/30/141443.htmlTomTomThu, 30 Aug 2007 09:11:00 GMThttp://m.tkk7.com/43880800/archive/2007/08/30/141443.htmlhttp://m.tkk7.com/43880800/comments/141443.htmlhttp://m.tkk7.com/43880800/archive/2007/08/30/141443.html#Feedback0http://m.tkk7.com/43880800/comments/commentRss/141443.htmlhttp://m.tkk7.com/43880800/services/trackbacks/141443.html     Java的堆是一个运行时数据?cȝ对象从中分配I间。这些对象通过new、newarray、anewarray和multianewarray{指令徏立,它们不需要程序代码来昑ּ的释放。堆是由垃圾回收来负责的Q堆的优势是可以动态地分配内存大小Q生存期也不必事先告诉编译器Q因为它是在q行时动态分配内存的QJava的垃圾收集器会自动收走这些不再用的数据。但~点是,׃要在q行时动态分配内存,存取速度较慢?
     栈的优势是,存取速度比堆要快Q仅ơ于寄存器,栈数据可以共享。但~点是,存在栈中的数据大与生存期必L定的,~Z灉|性。栈中主要存放一些基本类型的变量Q?int, short, long, byte, float, double, boolean, charQ和对象句柄?
栈有一个很重要的特D性,是存在栈中的数据可以共享。假设我们同时定义:
int a = 3;
int b = 3Q?
      ~译器先处理int a = 3Q首先它会在栈中创徏一个变量ؓa的引用,然后查找栈中是否?q个|如果没找刎ͼ将3存放q来Q然后将a指向3。接着处理int b = 3Q在创徏完b的引用变量后Q因为在栈中已经?q个|便将b直接指向3。这P出Ca与b同时均指?的情c?
      q时Q如果再令a=4Q那么编译器会重新搜索栈中是否有4|如果没有Q则?存放q来Qƈ令a指向4Q如果已l有了,则直接将a指向q个地址。因此a值的改变不会影响到b的倹{?
      要注意这U数据的׃n与两个对象的引用同时指向一个对象的q种׃n是不同的Q因U情况a的修改ƈ不会影响到b, 它是q译器完成的,它有利于节省I间。而一个对象引用变量修改了q个对象的内部状态,会媄响到另一个对象引用变量?
String是一个特D的包装cL据。可以用Q?
String str = new String("abc");
String str = "abc";
      两种的Ş式来创徏Q第一U是用new()来新建对象的Q它会在存放于堆中。每调用一ơ就会创Z个新的对象。而第二种是先在栈中创Z个对Stringcȝ对象引用变量strQ然后查找栈中有没有存放"abc"Q如果没有,则将"abc"存放q栈Qƈ令str指向”abc”Q如果已l有”abc” 则直接ostr指向“abc”?
比较c里面的数值是否相{时Q用equals()Ҏ(gu)Q当试两个包装cȝ引用是否指向同一个对象时Q用==Q下面用例子说明上面的理论?
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的?
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的对象。每一ơ生成一个?
     因此用第二种方式创徏多个”abc”字符?在内存中其实只存在一个对象而已. q种写法有利与节省内存空? 同时它可以在一定程度上提高E序的运行速度Q因为JVM会自动根据栈中数据的实际情况来决定是否有必要创徏新对象。而对于String str = new String("abc")Q的代码Q则一概在堆中创徏新对象,而不其字符串值是否相{,是否有必要创建新对象Q从而加重了E序的负担?
      另一斚w, 要注? 我们在用诸如String str = "abc"Q的格式定义cLQL惛_然地认ؓQ创ZStringcȝ对象str。担心陷阱!对象可能q没有被创徏Q而可能只是指向一个先前已l创建的对象。只有通过new()Ҏ(gu)才能保证每次都创Z个新的对象?
׃Stringcȝimmutable性质Q当String变量需要经常变换其值时Q应该考虑使用StringBufferc,以提高程序效率?

Tom 2007-08-30 17:11 发表评论
]]>
一个关于StringBuilder与StringBuffer性能的小试验 http://m.tkk7.com/43880800/archive/2007/02/20/100272.htmlTomTomTue, 20 Feb 2007 13:56:00 GMThttp://m.tkk7.com/43880800/archive/2007/02/20/100272.htmlhttp://m.tkk7.com/43880800/comments/100272.htmlhttp://m.tkk7.com/43880800/archive/2007/02/20/100272.html#Feedback2http://m.tkk7.com/43880800/comments/commentRss/100272.htmlhttp://m.tkk7.com/43880800/services/trackbacks/100272.html阅读全文

Tom 2007-02-20 21:56 发表评论
]]>
利用静态内部类为?zhn)的代码添加辅助功?http://m.tkk7.com/43880800/archive/2007/01/29/96530.htmlTomTomMon, 29 Jan 2007 08:21:00 GMThttp://m.tkk7.com/43880800/archive/2007/01/29/96530.htmlhttp://m.tkk7.com/43880800/comments/96530.htmlhttp://m.tkk7.com/43880800/archive/2007/01/29/96530.html#Feedback0http://m.tkk7.com/43880800/comments/commentRss/96530.htmlhttp://m.tkk7.com/43880800/services/trackbacks/96530.html 利用静态内部类为?zhn)的代码添加辅助功?/span>
作?/span> javaworld.com">John D. Mitchell

摘要
q个技巧提供了一个实例,它可以利用静态内部类为?zhn)的类d独立的、可选的辅助功能Q例如测试和CZ代码{。( 500 ?/span> Q?/span>

学会了这个技巧,(zhn)便可以?/span> 静态内部类 的用加入到(zhn)的 Java 使用技巧集锦当中。静态内部类是在另一个类的定义中q行定义Qƈ且标Cؓ静态的cR我向(zhn)展CZ个实例,它利用静态内部类向另一个类中添加测试代码?/span>

静态内部类在概念和实现上都十分单,基本上来说就是在(zhn)的ȝ中定义一个静态类Q?/span>

public class TestDebug

{

         private double num;

         public TestDebug(double in)

         {

                   num = in;

         }

         public void output()

         {

                   System.out.println(num);

                  

         }

         public static class Test

         {

                   public static void main(String[] args)

                   {

                            TestDebug td  = new TestDebug(3.9);

                            td.output();

 

                   }

         }

}

说到向?zhn)主要的类中添加辅助代码,其中最重要的一点就是静态内部类被编译到一个单独的 .class 文g中,q个文g独立于它的外部类。例如,如果外部cd?/span> Foo Q而它的一个内部类?/span> Test Q那么这个内部类被~译?/span> Foo$Test.class 文g?/span> .class 文g的分L味着(zhn)可以将辅助的嵌套代码与主要的外部类牢固地捆l在一赗它们在同一个源文g中,内部cȝ是在外部类?/span> 内部 。?zhn)无需再付ZQ何发布或q行时的开销。真!例如Q如果辅助代码只是用于调试,那么(zhn)只需发布 Foo.class 文g而将 Foo$Test.class 文g留下卛_?/span>

我将q个技巧主要用于编写外部类的演CZ码、错误调试代码,以及q行单元试实现c行为的自动验证。(当然Q做Z个勤奋的开发h员,我准备将试代码转化成单元测试。)

注意Q要执行 TestDebug .class main() Ҏ(gu)Q请使用下面的命令:

% java TestDebug$Test

如果(zhn)正在用的命o解释E序Q?/span> shell Q把 ??/span> 做ؓ一个保留字Q那么?zhn)应该使用下面的命令?/span>

% java TestDebug\$Test

q有一点十分有:静态内部类Ҏ(gu)定义可以讉K外部cȝ保护域和U有域。这件事可以说既有利也有弊。因为?zhn)可能在不l意间就破坏了外部类的保护域和私有域Q从而违反了它的装性,所以请心对待Q这一功能最恰当的应用就是编写类?/span> 白盒 试E序Q-因ؓq样可以引入一些利用通常?i>黑盒试很难引入的问题(黑盒试不能讉K对象的内部状态)?/span>

l论
通过使用静态内部类Q?zhn)可以l?zhn)的系l添加辅助功能,以便完成诸如试之类的工作,而对正式发布的品不会带来Q何不利媄响?/span>

 



Tom 2007-01-29 16:21 发表评论
]]>
PO BO VO DTO POJO DAO概念及其作用Q附转换图) http://m.tkk7.com/43880800/archive/2007/01/23/95478.htmlTomTomTue, 23 Jan 2007 02:51:00 GMThttp://m.tkk7.com/43880800/archive/2007/01/23/95478.htmlhttp://m.tkk7.com/43880800/comments/95478.htmlhttp://m.tkk7.com/43880800/archive/2007/01/23/95478.html#Feedback0http://m.tkk7.com/43880800/comments/commentRss/95478.htmlhttp://m.tkk7.com/43880800/services/trackbacks/95478.html

PO BO VO DTO POJO DAO概念及其作用Q附转换图)

Posted on 2007-01-08 17:52 交U赞 阅读(946) 评论(5)  ~辑 收藏引用|摘 所属分c? Java

   J2EE开发中大量的专业羃略语很是让hqhQ尤其是跟一些高手讨论问题的时候,三分钟就被h家满口的专业术语h了,PO VO BO DTO POJO DAOQ一大堆的就来了Q听q老罗对这U现象的批判的朋友会会心一W)?/p>

    首先声明偶也不是什么高手,以下ȝ都是自己的体会。不对之处请(zhn)多指教?/p>

POQ?br />persistant object持久对象

最形象的理解就是一个PO是数据库中的一条记录?br />好处是可以把一条记录作Z个对象处理,可以方便的{为其它对象?br />



BOQ?br />business object业务对象

主要作用是把业务逻辑装Z个对象。这个对象可以包括一个或多个其它的对象?br />比如一个简历,有教育经历、工作经历、社会关pȝ{?br />我们可以把教育经历对应一个POQ工作经历对应一个POQ社会关pd应一个PO?br />建立一个对应简历的BO对象处理历,每个BO包含q些PO?br />q样处理业务逻辑Ӟ我们可以针对BOd理?br />



VO Q?br />value object值对?br />ViewObject表现层对?br />
主要对应界面昄的数据对象。对于一个WEB面Q或者SWT、SWING的一个界面,用一个VO对象对应整个界面的倹{?br />



DTO Q?br />Data Transfer Object数据传输对象
主要用于q程调用{需要大量传输对象的地方?br />比如我们一张表?00个字D,那么对应的PO有100个属性?br />但是我们界面上只要显C?0个字D,
客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,
q时我们可以用只有q?0个属性的DTO来传递结果到客户端,q样也不会暴露服务端表结?到达客户端以后,如果用这个对象来对应界面昄Q那此时它的w䆾p{为VO



POJO Q?br />plain ordinary java object 单java对象
个h感觉POJO是最常见最多变的对象,是一个中间对象,也是我们最常打交道的对象?br />
一个POJO持久化以后就是PO
直接用它传递、传递过E中是DTO
直接用来对应表示层就是VO


DAOQ?br />data access object数据讉K对象
q个大家最熟?zhn)Q和上面几个O区别最大,基本没有互相转化的可能性和必要.
主要用来装Ҏ(gu)据库的访问。通过它可以把POJO持久化ؓPOQ用POl装出来VO、DTO


      ȝ下我认ؓ一个对象究竟是什么O要看具体环境Q在不同的层、不同的应用场合Q对象的w䆾也不一P而且对象w䆾的{化也是很自然的。就像你对老婆来说是老公Q对父母来说是子女。设计这些概늚初衷不是Z唬h而是Z更好的理解和处理各种逻辑Q让大家能更好的ȝ面向对象的方式处理问?

      大家千万不要陷入q度设计Q大可不必ؓ了设计而设计一定要在代码中区分各个对象。一句话技术是为应用服务的?br />
Ƣ迎指正?br />



M个图Q感觉没有完全表辑և自己的意思。。。。。谁帮忙完善下,最好能体现各个O在MVC中的位置
snap20070108.jpg


Tom 2007-01-23 10:51 发表评论
]]>
适配器模?/title><link>http://m.tkk7.com/43880800/archive/2007/01/23/95476.html</link><dc:creator>Tom</dc:creator><author>Tom</author><pubDate>Tue, 23 Jan 2007 02:44:00 GMT</pubDate><guid>http://m.tkk7.com/43880800/archive/2007/01/23/95476.html</guid><wfw:comment>http://m.tkk7.com/43880800/comments/95476.html</wfw:comment><comments>http://m.tkk7.com/43880800/archive/2007/01/23/95476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/43880800/comments/commentRss/95476.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/43880800/services/trackbacks/95476.html</trackback:ping><description><![CDATA[ <font color="#009900">适配器模式:<br />如果你有两个~译好的(无源代码)c,cA有某些功能,但是需要一个xmld模块才能工作Q?br />q个模块要实现这个接?<br />public interface XmlReader{<br />       public InputStream xmlReader();<br />}<br />你的另一个类B恰好有这个功能,但是B实现的是q个接口:<br />public interface ReaderXml{<br />       public InputStream readerXml();<br />}<br />q个时候我们的做法是写个适配?br />public class Adapter implements XmlReader extends B{<br />       public InputStream xmlReader(){<br />              return readerXml();<br />      }<br />}<br />q个是适配器模式了?br />适配器模式还有另外一U实现方?br />public class Adapter implements XmlReader<br />       ReaderXml b = new B();<br />       public InputStream xmlReader(){<br />               return b.readerXml();<br />       }<br />}</font> <img src ="http://m.tkk7.com/43880800/aggbug/95476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/43880800/" target="_blank">Tom</a> 2007-01-23 10:44 <a href="http://m.tkk7.com/43880800/archive/2007/01/23/95476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更详l的 Bridge Adapter Facade模式之间的比?/title><link>http://m.tkk7.com/43880800/archive/2007/01/23/95474.html</link><dc:creator>Tom</dc:creator><author>Tom</author><pubDate>Tue, 23 Jan 2007 02:34:00 GMT</pubDate><guid>http://m.tkk7.com/43880800/archive/2007/01/23/95474.html</guid><wfw:comment>http://m.tkk7.com/43880800/comments/95474.html</wfw:comment><comments>http://m.tkk7.com/43880800/archive/2007/01/23/95474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/43880800/comments/commentRss/95474.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/43880800/services/trackbacks/95474.html</trackback:ping><description><![CDATA[ <h2> <a id="viewpost1_TitleUrl" href="/dreamstone/archive/2007/01/08/92482.html"> <font style="BACKGROUND-COLOR: #ffffff" color="#800080">更详l的 Bridge Adapter Facade模式之间的比?/font> </a> <font color="#cc3333"> </font> </h2> <a href="/dreamstone/archive/2007/01/07/92268.html"> <font color="#a52a2a">在这文章中</font> </a> <font color="#a52a2a">Q我写了Bridge和adapter模式的区?但是 maninred?br />Bridge和adapter是没有关pȝQ而和Facade比较象,但在我的l验中更多的时?br />是会hBridge和adapter而不是FacadeQ这里详l的列出三个模式的比?.<br />一,定义:<br />1.Facade模式是ؓ一个复杂系l提供一个简单的接口?br />比如你要d物馆参观Q很多东西,你一个个到处去问每个东西的管理员很麻烦,所以你找一个导游,让他l你一个个介绍Q你只要扑ֈ导游好了。导游就是门面?br />2Q适配器模式,引用一下GOF95中的?<br />适配器模式是把一个类的接口变换成客户端所期待的另一U接口,从而原本因接口不匚w而无法工作的两个c能够工作到一赗?br />举个例子Q例如变压器<br />3QBridge模式:<br />GOF95中的桥梁模式的描qͼ桥梁模式的用意是"抽象化与实现化p,使的二者可以独立变化?br />例如AWT的实?br />?目的:<br />1,Facade模式使用在给一个复杂的pȝ提供l一的门?接口),目的是简化客L(fng)的操?但ƈ没有改变接口.<br />2,Adapter模式使用在两个部分有不同的接口的情况,目的是改变接?使两个部分协同工?br />3,桥梁模式是ؓ了分L象和实现<br />?使用场合<br />1,Facade模式出现较多的情冉|q样的情?你有一个复杂的pȝ,对应了各U情?<br />客户看了说功能不?但是使用太麻?你说没问?我给你提供一个统一的门?<br />所以Facade使用的场合多是对pȝ?优化".<br />2,Adapter模式出现的情冉|q样,你有一个类提供接口A,但是你的客户需要一个实现接口B的类,<br />q个时候你可以写一个Adapter让把A接口变成B接口,所以Adapter使用的场合是<br />指鹿为马.是你受Ҏ(gu)气的时?一边告诉你我只能提供给你A(?,一边告诉你?br />我只要B(?,他长了四条腿,你没办法?把鹿牵过去说,q是?你看他有四条?<br />(当然实现指鹿为马也有两种Ҏ(gu),一个方法是你只露出鹿的四条?说你看这是马,q种方式是<br />装方式的Adapter实现,另一U方式是你把鹿牵q去,但是首先介绍l他说这是马,因ؓ他长了四条腿<br />q种是承的方式.)<br />3,Bridge模式在一般的开发中出现的情况ƈ不多,AWT是一?SWT也算部分?<br />如果你的客户要求你开发一个系l?q个pȝ在Windows下运行界面的样子是Windows的样?<br />在Linux下运行是Linux下的样子.在Macintosh下运行要是Mac Os的样?<br />怎么? 定义一pd的控件Button,Text,radio,checkBox{等.供上层开发?br />使用,他们使用q些控g的方?利用q些控g构造一个系l的GUI,然后你ؓq些控g<br />写好Linux的实?让它在Linux上调用Linux本地的对应控?<br />在Windows上调用Windows本地的对应控?在Macintosh上调用Macintosh本地的对应控?br />ok,你的d完成?<br />?需求程?br />1,Facade的需求程度是"中等",因ؓ你不提供FacadeE序照样能工?只是不够?<br />2,Adapter的需求程度是"必须",因ؓ你不q么做就不能工作,除非你自׃头实C?<br />3,Bridge的需求程度是"一?,适合_求精的h,因ؓ你可以写三个E序l客?<br />?出现时期<br />1,Facade出现在项目中?再优?br />2,Adapter出现在项目后?大部分都有了,差的仅仅是接口不?br />3,Bridge出现在项目前?你想让你的系l更灉|,更cool<br />?在写文章的时候想到的<br />1,Facade很多时候是1:m的关p?br />2,Adapter很多是候是1:1的关p?br />3,Bridge很多时候是m:n的关p?br />呵呵.<br />?最?br />另外:回应一下maninred<br />1,我ƈ没有把模式看的很独立,其实很多模式是配合用的,而且在一定情况下可以<br />用一个替换另一?同一个需?有可能当你思考的角度不同?使用的模式就不同?<br />2,设计模式q不?用OO的封装来装所有的东西",模式其实可以应用于所有的设计?br />和OO没有直接的关p?只是因ؓ计算机的设计模式大部分是GOF攉ȝ?<br />他们讲解设计模式是用的C++,而在Java中得C大量应用,所以我们谈到设计模?br />的时候多提到OO.其实模式更早应用于徏{学,Alexander的《徏{的永恒之道》讲?br />是设计模式。所以说设计模式应该是设计过E中U篏下来的一些成型的东西?br />更深入一点,《Java与模式》的作者认为模式v源于中国的道教思想Q讲的是哲学。呵c?br />3Q对于模式的使用Q个人感觉,模式很大E度上是Z对应q类需求的所有情况,也就<br />是最复杂情况Q最灉|情况Q当我们实际的开发中q没有遇到这么多q样的情c?br />所以在需要的时候用,Ҏ(gu)需求简化用,而不是照搬?br />4,虽然模式是相关的Q但是只有知道了每个模式的区别点Q才能更好的Ҏ(gu)需求选择使用哪个模式?/font> <img src ="http://m.tkk7.com/43880800/aggbug/95474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/43880800/" target="_blank">Tom</a> 2007-01-23 10:34 <a href="http://m.tkk7.com/43880800/archive/2007/01/23/95474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java抽象cd接口的区?/title><link>http://m.tkk7.com/43880800/archive/2007/01/23/95467.html</link><dc:creator>Tom</dc:creator><author>Tom</author><pubDate>Tue, 23 Jan 2007 02:00:00 GMT</pubDate><guid>http://m.tkk7.com/43880800/archive/2007/01/23/95467.html</guid><wfw:comment>http://m.tkk7.com/43880800/comments/95467.html</wfw:comment><comments>http://m.tkk7.com/43880800/archive/2007/01/23/95467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/43880800/comments/commentRss/95467.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/43880800/services/trackbacks/95467.html</trackback:ping><description><![CDATA[ <span style="FONT-WEIGHT: 400"> <span id="9xbfhnr" class="unnamed4"> <font style="BACKGROUND-COLOR: #f5f5dc"> <font color="#0000ff"> <font style="FONT-SIZE: 9pt">abstract class和interface是Java语言中对于抽象类定义q行支持的两U机Ӟ正是׃q两U机制的存在Q才赋予了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方法,误者注意区分)定义的,那么什么是抽象c,使用抽象c能为我们带来什么好处呢Q ?br /><br />在面向对象的概念中,我们知道所有的对象都是通过cL描绘的,但是反过来却不是q样。ƈ不是所有的c都是用来描l对象的Q如果一个类中没有包含够的信息来描l一个具体的对象Q这L(fng)cd是抽象类。抽象类往往用来表征我们在对问题领域q行分析、设计中得出的抽象概念,是对一pd看上M同,但是本质上相同的具体概念的抽象。比如:如果我们q行一个图形编辑Y件的开发,׃发现问题领域存在着圆、三角Şq样一些具体概念,它们是不同的Q但是它们又都属于Ş状这样一个概念,形状q个概念在问题领域是不存在的Q它?yu)是一个抽象概c正是因为抽象的概念在问题领域没有对应的具体概念Q所以用以表征抽象概늚抽象cL不能够实例化的。 ?br /><br />在面向对象领域,抽象cM要用来进行类型隐藏。我们可以构造出一个固定的一l行为的抽象描述Q但是这l行为却能够有Q意个可能的具体实现方式。这个抽象描q就是抽象类Q而这一lQ意个可能的具体实现则表现为所有可能的zcR模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允怿改的Q同Ӟ通过从这个抽象体zQ也可扩展此模块的行为功能。熟(zhn)OCP的读者一定知道,Z能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle)Q抽象类是其中的关键所在。 ?br /><br /><br />从语法定义层面看abstract class和interface  <br /><br />在语法层面,Java语言对于abstract class和interfacel出了不同的定义方式Q下面以定义一个名为Demo的抽象类Z来说明这U不同。 ?br /><br />使用abstract class的方式定义Demo抽象cȝ方式如下Q ?br /><br />abstract class Demo ?jng) ?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只能够有静态的不能被修改的数据成员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承关p,一个类只能使用一ơ承关pR但是,一个类却可以实现多个interface。也许,q是Java语言的设计者在考虑Java对于多重l承的支持方面的一U折中考虑吧。 ?br /><br />其次Q在abstract class的定义中Q我们可以赋予方法的默认行ؓ。但是在interface的定义中Q方法却不能拥有默认行ؓQؓ了绕q这个限Ӟ必须使用委托Q但是这会 增加一些复杂性,有时会造成很大的麻烦。 ?br /><br />在抽象类中不能定义默认行存在另一个比较严重的问题Q那是可能会造成l护上的ȝ。因为如果后来想修改cȝ界面Q一般通过abstract class或者interface来表C)以适应新的情况Q比如,d新的Ҏ(gu)或者给已用的方法中d新的参数Q时Q就会非常的ȝQ可能要p很多的时_对于zcd多的情况Q尤为如此)。但是如果界面是通过abstract class来实现的Q那么可能就只需要修改定义在abstract class中的默认行ؓ可以了。 ?br /><br />同样Q如果不能在抽象cM定义默认行ؓQ就会导致同L(fng)Ҏ(gu)实现出现在该抽象cȝ每一个派生类中,q反?one ruleQone place"原则Q造成代码重复Q同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心。 ?br /><br /><br />从设计理念层面看abstract class和interface  <br /><br />上面主要从语法定义和~程的角度论qCabstract class和interface的区别,q些层面的区别是比较低层ơ的、非本质的。本节从另一个层面:abstract class和interface所反映出的设计理念Q来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概늚本质所在。 ?br /><br />前面已经提到q,abstarct class在Java语言中体C一U承关p,要想使得l承关系合理Q父cdzcM间必d?is a"关系Q即父类和派生类在概忉|质上应该是相同的Q参考文献?〕中有关?is a"关系的大幅深入的论qͼ有兴的读者可以参考)。对于interface 来说则不Ӟq不要求interface的实现者和interface定义在概忉|质上是一致的Q仅仅是实现了interface定义的契U而已。ؓ了便于理解Q下面将通过一个简单的实例q行说明。 ?br /><br />考虑q样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Doorh执行两个动作open和closeQ此时我们可以通过abstract class或者interface来定义一个表C抽象概念的类型,定义方式分别如下所C:  <br /><br />使用abstract class方式定义DoorQ ?br /><br />abstract class Door {  <br /> abstract void open();  <br /> abstract void close()Q ?br />}  <br /><br />   <br />使用interface方式定义DoorQ ?br /><br /><br />interface Door {  <br /> void open();  <br /> void close();  <br />}  <br /><br />   <br />其他具体的Doorcd可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看h好像使用abstract class和interface没有大的区别。 ?br /><br />如果现在要求Doorq要h报警的功能。我们该如何设计针对该例子的cȝ构呢Q在本例中,主要是ؓ了展Cabstract class和interface反映在设计理念上的区别,其他斚w无关的问题都做了化或者忽略)Q下面将|列出可能的解决Ҏ(gu)Qƈ从设计理念层面对q些不同的方案进行分析。 ?br /><br />解决Ҏ(gu)一Q ?br /><br />单的在Door的定义中增加一个alarmҎ(gu)Q如下:  <br /><br />abstract class Door {  <br /> abstract void open();  <br /> abstract void close()Q ?br /> abstract void alarm();  <br />}  <br /><br />   <br />或者 ?br /><br />interface Door {  <br /> void open();  <br /> void close();  <br /> void alarm();  <br />}  <br /><br />   <br />那么h报警功能的AlarmDoor的定义方式如下:  <br /><br />class AlarmDoor extends Door {  <br /> void open() { … }  <br /> void close() { … }  <br /> void alarm() { … }  <br />}  <br /><br />   <br />或者 ?br /><br />class AlarmDoor implements Door ?jng) ?br /> void open() { … }  <br /> void close() { … }  <br /> void alarm() { … }  <br />} ?br /><br />q种Ҏ(gu)q反了面向对象设计中的一个核心原则ISPQInterface Segregation PricipleQ,在Door的定义中把Door概念本n固有的行为方法和另外一个概?报警?的行为方法؜在了一赗这样引L(fng)一个问题是那些仅仅依赖于Doorq个概念的模块会因ؓ"报警?q个概念的改变(比如Q修改alarmҎ(gu)的参敎ͼ而改变,反之依然。 ?br /><br />解决Ҏ(gu)二:  <br /><br />既然open、close和alarm属于两个不同的概念,Ҏ(gu)ISP原则应该把它们分别定义在代表q两个概늚抽象cM。定义方式有Q这两个概念都用abstract class方式定义Q两个概念都使用interface方式定义Q一个概念用abstract class方式定义Q另一个概念用interface方式定义。 ?br /><br />昄Q由于Java语言不支持多重承,所以两个概念都使用abstract class方式定义是不可行的。后面两U方式都是可行的Q但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意囄反映是否正确、合理。我们一一来分析、说明。 ?br /><br />如果两个概念都用interface方式来定义,那么反映出两个问题Q?、我们可能没有理解清楚问题领域,AlarmDoor在概忉|质上到底是Doorq是报警器?2、如果我们对于问题领域的理解没有问题Q比如:我们通过对于问题领域的分析发现AlarmDoor在概忉|质上和Door是一致的Q那么我们在实现时就没有能够正确的揭C我们的设计意图Q因为在q两个概늚定义上(均用interface方式定义Q反映不Zq含义。 ?br /><br />如果我们对于问题领域的理解是QAlarmDoor在概忉|质上是DoorQ同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢Q前面已l说q,abstract class在Java语言中表CZU承关p,而承关pd本质上是"is a"关系。所以对于Doorq个概念Q我们应该用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行ؓQ所以报警概念可以通过interface方式定义。如下所C:  <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 /><br />   <br />q种实现方式基本上能够明的反映出我们对于问题领域的理解Q正的揭示我们的设计意图。其实abstract class表示的是"is a"关系Qinterface表示的是"like a"关系Q大家在选择时可以作Z个依据,当然q是建立在对问题领域的理解上的,比如Q如果我们认为AlarmDoor在概忉|质上是报警器Q同时又hDoor的功能,那么上述的定义方式就要反q来了?/font> </font> </font> </span> </span> <img src ="http://m.tkk7.com/43880800/aggbug/95467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/43880800/" target="_blank">Tom</a> 2007-01-23 10:00 <a href="http://m.tkk7.com/43880800/archive/2007/01/23/95467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDOM使用详解及实?/title><link>http://m.tkk7.com/43880800/archive/2006/12/12/87308.html</link><dc:creator>Tom</dc:creator><author>Tom</author><pubDate>Tue, 12 Dec 2006 09:21:00 GMT</pubDate><guid>http://m.tkk7.com/43880800/archive/2006/12/12/87308.html</guid><wfw:comment>http://m.tkk7.com/43880800/comments/87308.html</wfw:comment><comments>http://m.tkk7.com/43880800/archive/2006/12/12/87308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/43880800/comments/commentRss/87308.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/43880800/services/trackbacks/87308.html</trackback:ping><description><![CDATA[     摘要: JDOM使用详解及实? 一? JDOM ? ...  <a href='http://m.tkk7.com/43880800/archive/2006/12/12/87308.html'>阅读全文</a><img src ="http://m.tkk7.com/43880800/aggbug/87308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/43880800/" target="_blank">Tom</a> 2006-12-12 17:21 <a href="http://m.tkk7.com/43880800/archive/2006/12/12/87308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Aaron Johnson对Class.forName()的解?/title><link>http://m.tkk7.com/43880800/archive/2006/11/19/Tom.html</link><dc:creator>Tom</dc:creator><author>Tom</author><pubDate>Sun, 19 Nov 2006 12:44:00 GMT</pubDate><guid>http://m.tkk7.com/43880800/archive/2006/11/19/Tom.html</guid><wfw:comment>http://m.tkk7.com/43880800/comments/82096.html</wfw:comment><comments>http://m.tkk7.com/43880800/archive/2006/11/19/Tom.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/43880800/comments/commentRss/82096.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/43880800/services/trackbacks/82096.html</trackback:ping><description><![CDATA[ <font color="#008000"> <br /> </font> <div id="f7jzjbj" class="postbody"> <p> <font color="#008000">    A reader asked a question via a comment a couple months ago that I didn't really have an answer for (and had always kind of wondered the same thing). In <a >the original post</a> (which showed how to use JDBC with ColdFusion), I used the following snippet of code:<br /><code><br />Class.forName("jdbc.DriverXYZ");<br />Connection con = DriverManager.getConnection(url,<br />  "myLogin", "myPassword");<br /></code><br />and the reader wanted to know what the <code>Class.forName(..)</code> method did. The most common answer you'll hear is that it loads the database driver, which, while technically true, is shallow. Where does it get loaded? How does it happen? And why?</font> </p> <p> <font color="#008000">To answer the question I started with the <a >JavaDoc for the Class.forName() method</a>. According to the documentation, the method: </font> </p> <blockquote> <font color="#008000">... attempts to locate, load, and link the class or interface</font> </blockquote> <font color="#008000">I wasn't perfectly clear on what "locate, load, and link" meant, so I did a little digging through the <a >Java Language Specification</a>. According to <a >chapter 12 of the JLS</a>: </font> <blockquote> <font color="#008000">Loading refers to the process of finding the binary form of a class or interface type with a particular name, perhaps by computing it on the fly, but more typically by retrieving a binary representation previously computed from source code by a compiler, and constructing, from that binary form, a Class object to represent the class or interface.</font> </blockquote> <font color="#008000">Next, again according to the JLS, it must be transformed from it's binary representation to something the Java virtual machine can use, this process is called linking. Finally, the class is initialized, which is the process that executes the static initializer and the initializers for static fields declared in the class. </font> <p> <font color="#008000">So then back to the original problem, when Class.forName() is called with an argument like this:<br /><code><br />Class.forName("org.gjt.mm.mysql.Driver");<br /></code><br />the classloader attempts to load and link the <code>Driver</code> class in the "org.gjt.mm.mysql" package and if successful, the static initializer is run. The MySQL <code>Driver</code> (download the <a >source code</a>) static initializer looks like this:<br /><code><br />static {<br />  try {<br />    java.sql.DriverManager.registerDriver(new Driver());<br />  } catch (SQLException E) {<br />    throw new RuntimeException("Can't register driver!");<br />  }<br />}<br /></code><br />So it calls a static method in the <a >java.sql.DriverManager</a> class which apparently registers a copy of itself when it loads.</font> </p> <p> <font color="#008000">So now I understand the where and the how, what about why? To understand the why you have to look at the next line in the initial code example:<br /><code><br />Connection con = DriverManager.getConnection(url,<br />  "myLogin", "myPassword");<br /></code><br />The <code>DriverManager</code> class (view DriverManager source <a >here</a>) returns a database connection given a JDBC URL string, a username and a password. In order to create that connection, the DriverManager class has to know which database driver you want to use. It does that by iterating over the array (internally a Vector) of drivers that have registered with it (ie: the <code>registerDriver(Driver driver)</code> method illustrated above) and calls the <code>acceptsURL(url))</code> method on each driver in the array, effectively asking the driver to tell it whether or not it can handle the JDBC URL. </font> </p> <p> <font color="#008000">So there you have it. Class.forName explained.</font> </p> </div> <img src ="http://m.tkk7.com/43880800/aggbug/82096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/43880800/" target="_blank">Tom</a> 2006-11-19 20:44 <a href="http://m.tkk7.com/43880800/archive/2006/11/19/Tom.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://8123pp.com" target="_blank">þþƷվѹۿ</a>| <a href="http://h7277.com" target="_blank">ֻˬƵ</a>| <a href="http://331927.com" target="_blank">AV</a>| <a href="http://wwwjjz.com" target="_blank">Ƶ˳߲</a>| <a href="http://038037.com" target="_blank">þ99ȾƷѹۿţţ</a>| <a href="http://muguangmi.com" target="_blank">Ļ޾Ʒһ</a>| <a href="http://zf91.com" target="_blank">ھƷþþþþþ</a>| <a href="http://2255325.com" target="_blank">޳aëƬ</a>| <a href="http://yanshimlxg.com" target="_blank">һaƵۿվ</a>| <a href="http://qnyjny.com" target="_blank">޸Ƶ߲</a>| <a href="http://6789311.com" target="_blank">gavѲƵ</a>| <a href="http://js06vip.com" target="_blank">ƷAVƬ߹ۿ</a>| <a href="http://jx-dirui.com" target="_blank">ŷ</a>| <a href="http://520baoyu.com" target="_blank">޳AvƬɫҹ</a>| <a href="http://by33321.com" target="_blank">鶹Ʒѹۿ</a>| <a href="http://zzhdrsqwx.com" target="_blank">ٸһ</a>| <a href="http://haigoumama.com" target="_blank">޸һѿ</a>| <a href="http://www-175345.com" target="_blank">޹ŮaaaëƬ</a>| <a href="http://www6661126.com" target="_blank">ĻƵ</a>| <a href="http://1777000.com" target="_blank">ۺƵ</a>| <a href="http://www876444.com" target="_blank">a߹ۿ</a>| <a href="http://ahjmdd.com" target="_blank">bbbѹۿƵ</a>| <a href="http://fphs666.com" target="_blank">޹Ʒ˾Ʒ</a>| <a href="http://qu41.com" target="_blank">޾Ʒ޿һ</a>| <a href="http://bjgelinhotel.com" target="_blank">߹ۿav</a>| <a href="http://3333kkkk.com" target="_blank">鶹˴ýѹۿ</a>| <a href="http://binz132.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://dzyong.com" target="_blank">Ʒ޳AA߹ۿ </a>| <a href="http://99880524.com" target="_blank">ѻɫƵ</a>| <a href="http://97chaopeng2.com" target="_blank">Ʒѿþþ㽶</a>| <a href="http://wwwkk5679.com" target="_blank">Ļ޾Ʒ</a>| <a href="http://haohaoshuo.com" target="_blank">avһ</a>| <a href="http://bdykdq.com" target="_blank">Ļۺ234</a>| <a href="http://zhiwajic.com" target="_blank">Ů18ëƬѹۿ</a>| <a href="http://sanyoumiaomu.com" target="_blank">Ƶѹۿ</a>| <a href="http://nonobo.com" target="_blank">þþþùɫavѿ</a>| <a href="http://ahzlgj.com" target="_blank">ŮͬAƬ߹ۿ</a>| <a href="http://shzzhsy.com" target="_blank">ůůƵƵ</a>| <a href="http://006dh.com" target="_blank">sss߹ۿѸ</a>| <a href="http://shiliuvip.com" target="_blank">һ234</a>| <a href="http://pgb168.com" 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>