zoukankan      html  css  js  c++  java
  • Java之代理模式

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
    这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法

    静态代理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    package com.teenyda.静态代理;
    public class Demo1 {
    public static void main(String[] args) {
    IInsert stu = new StuDao();
    IInsert proxy = new InsertProxy(stu);
    proxy.insert("insert into p values....");
    proxy.update("update stu set ...");
    }
    }
    interface IInsert {
    void insert(String sql);
    void update(String sql);
    }
    class InsertProxy implements IInsert {
    private IInsert obj;
    public InsertProxy(IInsert obj) {
    this.obj = obj;
    }
    @Override
    public void insert(String sql) {
    System.out.println("开始执行:");
    obj.insert(sql);
    System.out.println("执行完毕!");
    }
    @Override
    public void update(String sql) {
    System.out.println("开始执行");
    obj.update(sql);
    System.out.println("执行完毕!");
    }
    }
    class StuDao implements IInsert {
    @Override
    public void insert(String sql) {
    System.out.println(sql);
    }
    @Override
    public void update(String sql) {
    System.out.println(sql);
    }
    }

    动态代理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    package com.teenyda.动态代理;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    public class Demo2 {
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    ILogin user = new Usre();
    InvocationHandler handler = new UserHandler(user);
    Class<?> clazz = user.getClass();
    ILogin u = (ILogin)Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), handler);
    u.login("张三");
    u.killBoss("张三");
    大专栏  Java之代理模式 u.update("张三");
    }
    }
    //接口
    interface ILogin{
    void login(String name);
    void killBoss(String name);
    void update(String name);
    }
    //被代理类
    class Usre implements ILogin{
    @Override
    public void login(String name) {
    // TODO Auto-generated method stub
    System.out.println(name+"登录啦!");
    }
    @Override
    public void killBoss(String name) {
    // TODO Auto-generated method stub
    System.out.println(name+"击杀boss啦!");
    }
    @Override
    public void update(String name) {
    // TODO Auto-generated method stub
    System.out.println(name+"升级啦!");
    }
    }
    //代理类
    class UserHandler implements InvocationHandler{
    private Object obj;
    public UserHandler(Object obj) {
    this.obj = obj;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.print("log:");
    method.invoke(obj, args);
    System.out.println("正在记录!");
    return args;
    }
    }

    动态代理-之Cglibcloud-cglib.jar

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    package com.teenyda.MethodInterceptor代理;
    import java.lang.reflect.Method;
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    /**
    * @author 作者 E-mail:
    * @date 创建时间:2018年1月21日 上午9:55:04
    * @version 1.0
    * @parameter
    * @since
    * @return
    */
    public class Demo3 {
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    ManagerProxy proxy = new ManagerProxy();
    Manager m = (Manager)proxy.getProxy(Manager.class);
    m.root();
    ManagerProxy p2 = new ManagerProxy();
    Super s = (Super)p2.getProxy(Super.class);
    s.delete();
    }
    }
    class Manager{
    public void root() {
    System.out.println("执行root");
    }
    }
    class Super{
    public void delete() {
    System.out.println("执行删除操作!");
    }
    }
    class ManagerProxy implements MethodInterceptor{
    private Enhancer enhancer = new Enhancer();
    public Object getProxy(Class<?> clazz) {
    enhancer.setSuperclass(clazz);
    enhancer.setCallback(this);
    return enhancer.create();
    }
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    System.out.println("截拦!");
    proxy.invokeSuper(obj, args);
    System.out.println("保存!");
    return null;
    }
    }
  • 相关阅读:
    大数据分析项目中的“最差”实践
    【Python】Python正则表达式使用指导
    大数据分析的5个方面
    你真的会python嘛?
    你是如何自学 Python 的?
    python中#!/usr/bin/python与#!/usr/bin/env python的区别
    [实验吧刷题]密码学部分
    [bugku]高阶web 综合帖
    [bugku]sqlmap部分
    【ctf第一次校赛】+不会的web/ +凉凉的省赛预赛 + 最后摸了 个二等。。
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12099773.html
Copyright © 2011-2022 走看看