ActiveMQ typeScript django PaddleHub Eclipse SQLMAP forms post scroll syntax scope xampp 郑州普通话考试 seo教程下载 js获取焦点事件 python数据挖掘实战pdf pytorch安装教程 matlab中axis git下载项目 linux查看防火墙 mysql将时间戳转换成日期 python编程 python教学 python正则替换 python处理json文件 java查看版本 java中的抽象类 java注释 java泛型的使用 java数组转集合 java获取当前日期 java游戏制作 机械下载 stata软件 脚本 sim卡注册失败 虚拟打印机安装 说话不算数的经典语句 保留小数点后两位 怎么看淘龄
当前位置: 首页 > 学习教程  > 编程语言

框架基础之代理模式(Proxy)

2020/8/11 20:24:55 文章标签:

代理模式

代理的作用:为了实现在不更改被代理类的基础上 对被代理类的功能进行扩展

代理对象:被代理对象的功能进行扩展(中介)

目标对象:被代理对象

原则:代理对象 代理的是目标对象 不能有更多的功能

静态代理

  1. 代理类和被代理类必须实现相同接口
  2. 代理类中需要定义成员变量 来接受被代理者

缺点:

  1. 代理类和被代理类必须实现同一个接口 局限性比较大
  2. 代理类只能对指定接口类型的实现类进行控制
    而且只能扩展接口中定义的方法

过程:

定义接口

创建被代理类

创建代理类(代理类可以为被代理增加功能)

测试

把被代理类给代理类的成员

public class Demo1 {
    public static void main(String[] args) {
        //创建对象进行关联
        Student stu=new Student("韩梅梅","1001");
        StudentProxy spy=new StudentProxy();
        spy.p=stu;
        spy.show();
        spy.eat("面包");
    }

}
//静态代理
//1定义接口
interface Person{
    void show();
    void eat(String food);
}
//2创建被代理类
class Student implements Person{
    String sname;
    String sclass;
    @Override
    public void show() {
        System.out.println("我是"+sclass+"班的学生"+sname);
    }

    @Override
    public void eat(String food) {
        System.out.println(sname+"正在吃"+food);
    }

    public Student(String sname, String sclass) {
        this.sname = sname;
        this.sclass = sclass;
    }
}
//3 创建代理类 来代理student 对其功能进行扩展
class StudentProxy implements Person{
    Person p;

    @Override
    public void show() {
        p.show();
        System.out.println("女");
    }

    @Override
    public void eat(String food) {
        p.eat(food);
        System.out.println("吃饱");
    }
}

动态代理

  1. 创建工厂类实现invocationHander
  2. 定义成员变量与被代理对象关联
  3. 实现invoke方法 被代理对象的方法进行扩展
  4. 定义方法getinstance 通过Proxy类的静态方法newProxyinstance方法类动态获取代理对象
  5. 定义被代理类 并提取接口

过程:

创建代理工厂实现接口invocationHander(写一次就行,哪个实体类都能用)

创建接口

被代理类实现该接口(在被代理类中重写接口并对功能进行扩展)

测试

把被代理类关联给工厂

public class Demo2 {
    public static void main(String[] args) {
        //7创建被代理类对象
        Worker w=new Worker("王",18);
        //8创建代理工厂对象 并关联被代理对象
        ProxyFactroy factroy=new ProxyFactroy(w);
        //9调用工厂对象的getProxyInstance方法类动态获取代理对象
        Inte1 i=(Inte1) factroy.getInstance();
        i.show();//调用代理对象
        i.work();
    }
}
//1创建一个代理工厂类 实现接口invocationHander
class ProxyFactroy implements InvocationHandler{
    private Object target;//2定义成员变量记录被代理对象

    public ProxyFactroy(Object target) {//3通过构造方法的参数列表 关联被代理的对象
        this.target = target;
    }
    //4实现invoke方法 对目标对象的方法进行控制 代理对象的方法被调用时 会执行invoke
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(target, args);//调用目标对象的方法
        return result;
    }
    //5定义一个方法:getInstance 来创建动态创建代理对象
    public Object getInstance(){
        /*
        Proxy.newProxyInstance(loader,interfaces,h)
        loader:代理对象的类加载器,
        interfaces:代理对象要实现的接口==被代理对象实现的接口
        h:InvocationHander的实现类对象
         */
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
}
//6定义被代理类:必须实现接口
class Worker implements Inte1{
    String name;
    int age;

    public Worker(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public void show() {
        System.out.println("我是一名工人:我叫"+name+",今年"+age+"岁!");
    }

    @Override
    public void work() {
        System.out.println("工人"+name+"正在辛勤工作!!");
    }
}
interface Inte1{
    void show();
    void work();
}

cglib代理

cglib又称子类代理:在内存中动态创建一个目标的子类 通过重写目标类方法 实现对功能的扩展

过程:

导入jar包

在这里插入图片描述

创建工厂关键字MethodInterceptor

创建目标类

测试

public class Demo3 {
    public static void main(String[] args) {
        Teacher t=new Teacher(22,"王xx");
        ziProxyFactory factory=new ziProxyFactory(t);
        Teacher proxy=(Teacher) factory.getInstance();
        proxy.show();
        proxy.teach();
    }
}
//1创建子类对象工厂类
class ziProxyFactory implements MethodInterceptor{
    //2定义成员记录目的对象
    private Object target;

    public ziProxyFactory(Object target) {//通过构造方法关联目标对象
        this.target = target;
    }
    //3目标对象的方法被调用时 intercept方法就会执行
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Object result = method.invoke(target, objects);
        return result;
    }
    //4定义一个动态生成目标类的的子类对象
    public Object getInstance(){
        //4.1创建加强工具类
        Enhancer er=new Enhancer();
        //4.2指定要加强的父类
        er.setSuperclass(target.getClass());
        er.setCallback(this);//4.3设置回调函数
        return er.create();//4.4返回一个子类对象
    }
}
//5定义目标类
class Teacher{
    int age;
    String name;

    public Teacher(int age, String name) {
        this.age = age;
        this.name = name;
    }
    void show(){
        System.out.println("我是"+name+"今年"+age);
    }
    void teach(){
        System.out.println(name+"正在教书");
    }

    public Teacher() {//目标类必须有无参构造
        super();
    }
}

本文链接: http://www.dtmao.cc/news_show_100338.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?