设计模式1

1、简单工程(不想说)

2、工厂模式(不想说)

3、抽象工厂模式(不想说,友情看经典产品族的那个张图,一看就会)

4、原型模式:

        1、继承cloneable方法,返回super.clone(); 浅克隆,copy的是对象的引用

        2、继承cloneable方法,通过系列化,反系列化生成新的对象;,或者通过JSON对象转化string,在string转换成对象, 深克隆,copy的是值,

          jdk下中HashMap,ArrayList,实现cloneable,使用的是深克隆,.  代码就不展示

5、建造者模式: 请参考StringBulider 一直可追加  StringBuilder sb = new StringBuilder(); sb.append("aa").append("aa");

以上都是创建型的设计模式。为了创建对象

6、代理模式,静态代理我就不讲,静态代理单一,一个代理对象只能去为一个接口服务。

    1、jdk代理,前提条件:代理对象必须是个接口,通过实现InvocationHandler, 通过反射生成一个新类,在内存中可见

         

JdkProxy jdkProxy = new JdkProxy();
IPerson person = (IPerson) jdkProxy.getInstall(new LisiPerson());

// 断点下
person.find();

// 在内存中把字节码都到class文件

byte [] bytes = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{IPerson.class});
FileOutputStream fileOutputStream = new FileOutputStream("E:\\aa.class");
fileOutputStream.write(bytes);
fileOutputStream.close();

// 在反编译下如下java文件。如下,可以清晰可见jdk是通过反射来实现的

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
import jdkproxy.IPerson;

public final class  extends Proxy implements IPerson {

   private static Method m1;
   private static Method m3;
   private static Method m2;
   private static Method m0;


   public (InvocationHandler var1) throws  {
      super(var1);
   }

   public final boolean equals(Object var1) throws  {
      try {
         return ((Boolean)super.h.invoke(this, m1, new Object[]{var1})).booleanValue();
      } catch (RuntimeException | Error var3) {
         throw var3;
      } catch (Throwable var4) {
         throw new UndeclaredThrowableException(var4);
      }
   }

   public final void find() throws  {
      try {
         super.h.invoke(this, m3, (Object[])null);
      } catch (RuntimeException | Error var2) {
         throw var2;
      } catch (Throwable var3) {
         throw new UndeclaredThrowableException(var3);
      }
   }

   public final String toString() throws  {
      try {
         return (String)super.h.invoke(this, m2, (Object[])null);
      } catch (RuntimeException | Error var2) {
         throw var2;
      } catch (Throwable var3) {
         throw new UndeclaredThrowableException(var3);
      }
   }

   public final int hashCode() throws  {
      try {
         return ((Integer)super.h.invoke(this, m0, (Object[])null)).intValue();
      } catch (RuntimeException | Error var2) {
         throw var2;
      } catch (Throwable var3) {
         throw new UndeclaredThrowableException(var3);
      }
   }

   static {
      try {
         m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[]{Class.forName("java.lang.Object")});
         m3 = Class.forName("jdkproxy.IPerson").getMethod("find", new Class[0]);
         m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
         m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
      } catch (NoSuchMethodException var2) {
         throw new NoSuchMethodError(var2.getMessage());
      } catch (ClassNotFoundException var3) {
         throw new NoClassDefFoundError(var3.getMessage());
      }
   }
}

   2、cglib代理,前提条件是类,而且不能私有,实现MethodInterceptor , 它实现是通过生成字节码(Enhaner)文件生成一个派生类去重写父类的方法

      

 

        

上一篇:python动态变量名定义与调用


下一篇:解决 Node 服务器返回结果的中文出现乱码