设计模式&注解随笔

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 用于修饰字段




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值