设计模式&注解随笔

2019-04-14 08:18发布

Java中的23种设计模式: Factory(工厂模式),      Builder(建造模式),       Factory Method(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式),    Facade(门面模式), Adapter(适配器模式),    Bridge(桥梁模式),        Composite(合成模式), Decorator(装饰模式),    Flyweight(享元模式),     Proxy(代理模式), Command(命令模式),      Interpreter(解释器模式), Visitor(访问者模式), Iterator(迭代子模式),   Mediator(调停者模式),    Memento(备忘录模式), Observer(观察者模式),   State(状态模式),         Strategy(策略模式), Template Method(模板方法模式), Chain OfResponsibleity(责任链模式)

JDK动态代理 HttpServletRequest myRequest = (HttpServletRequest) Proxy.newProxyInstance(request.getClass().getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("getParameter".equalsIgnoreCase(method.getName())) { // getParammet方法进行增强 if ("get".equalsIgnoreCase(request.getMethod())) { //get请求进行转码 String invoke = (String) method.invoke(request, args); // 对获得的值进行转码 invoke = new String(invoke.getBytes("iso8859-1"),"utf-8"); return invoke; } else { // 不做处理 } } return method.invoke(request, args); } });


Cglib动态代理 public class TestCglibDynamicProxy { public static void main(String[] args) { //1.获得被代理的对象 See see = new SeeChild(); ProxyClassCglib pr = new ProxyClassCglib(see); See creatSee = pr.creatSee(); creatSee.see(); } } class ProxyClassCglib implements MethodInterceptor{ //1.创建一个用来接收代理类对象的成员变量 private See see; //2.设置构造 public ProxyClassCglib(See see){ this.see = see; } /** * 增强指定方法 */ @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { if("see".equals(method.getName())){ /** * methodProxy.invokeSuper(proxy, args); * 执行当前代理类的父类中的see的对应方法 * method.invoke(see, args); * 执行被代理类的对应方法 */ method.invoke(see, args); methodProxy.invokeSuper(proxy, args); System.out.println("增强see"); return null; } return method.invoke(see, args); } //4.返回代理对象 public See creatSee(){ //1.创建Cglib核心文件 Enhancer enhancer = new Enhancer(); //2.设置父类(设置父类的话,如果设置为父类.class,可以在增强方法中即可调用当前类的方法,也可以调用代理类对应的方法;如果设置代理对象.class,则只可以在增强方法中执行代理对象中对应的方法) enhancer.setSuperclass(See.class); //3.设置回调Callback类型,Callback应该是个MethodInterceptor的父接口,没有源码、、 enhancer.setCallback(this); //4.生成代理类 See see = (See) enhancer.create(); //返回代理对象 return see; } } Java内置注解 @Override 判断该方法是否为重写方法 @Deprecated 表示方法是已经过时的方法 @SuppressWarnings(value) 抑制警告,value表示警告类型 deprecation 忽略过时警告 rawtypes 忽略类型安全警告 unused 忽略不使用警告 unchecked 忽略安全检查 null 忽略空指针警告 all 忽略所有 value的值可以是单个字符串也可以是一个字符串数组
自定义注解 @interface MyAnnotation{ int age; Strign name; .... Object obj default new User();//default 表示给定一个默认值 } 若属性名为value,且只有这一个属性时,value可以省略,直接传值; 若属性类型维数组,值只有一个,{}可以省略 元注解 JDK提供了四种元注解 @Retention(RetentionPolicy.XXXX) 确定注解的生命周期 SOURCE 表示被修饰的注解只能存在源码阶段,写代码时起作用 CLASS  存在于字节码阶段,编译时起作用 RUNTIME 存在于运行阶段,运行中起作用 @Target(ElementType.XXXX) 确定注解的使用位置 TYPE 用于修饰类,接口 CONSTRUCTOR 用于修饰构造 METHOD 用于修饰方法 FIELD 用于修饰字段