设计模式-代理模式

代理模式分析

简介
代理模式分为:

  1. 静态代理模式
  2. 动态代理模式

静态代理模式

静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类,实现方式类似于装饰器模式,但是其目的不一样。

看下类图
在这里插入图片描述

代码示例

/*静态代理模式*/
public class StaticProxyModule {

    interface IUserDao{
        void save();
    }

    static class UserDaoImpl implements IUserDao{

        @Override
        public void save() {
            System.out.println("save...........");
        }
    }

    static class ProxyDao implements IUserDao{

        private IUserDao userDaoImpl;
        public ProxyDao(IUserDao userDao) {
            this.userDaoImpl = userDao;
        }

        @Override
        public void save() {
            userDaoImpl.save();
        }
    }

    public static void main(String[] args){
        IUserDao userDao = new UserDaoImpl();
        ProxyDao proxyDao = new ProxyDao(userDao);
        proxyDao.save();
    }
}

优点

  1. 可以做到在不修改目标对象的功能前提下,对目标功能扩展

缺点

  1. 因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护

动态代理模式

在程序运行时,通过反射机制动态地创建一个代理类。

  1. 动态的体现:程序开始执行时是没有代理类的,在程序运行时,java利用反射机制动态生成代理类的实例
  2. jdk技术支持:java在java.lang.reflect包里提供两个类/接口帮助我们创建和使用代理类实例,一个是Proxy类,一个是InvocationHandler接口
  3. 两种代理类的模式区别:静态模式要求为程序中所有需要被访问的目标创建代理类,如果有10种代理目标,我们就得创建10个代理类,让代理类直接访问目标对象

类图结构

代码实例

public class SubjectProxyModule {

    static class ProxyFactory implements InvocationHandler {
        Object target;

        public ProxyFactory(Object target) {
            this.target = target;
        }

        public Object getProxyInstance() {
            return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(), this);
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            return method.invoke(target, args);
        }
    }

    interface SubjectInterface {
        void println();
        void println111();
    }

    static class SubjectA  implements SubjectInterface{
        @Override
        public void println() {
            System.out.println("哈哈哈哈哈..........");
        }

        @Override
        public void println111() {
            System.out.println("哈哈哈哈哈..........11111111111");
        }
    }

    public static void main(String[] args) {
        SubjectInterface subjectA = new SubjectA();
        SubjectInterface subjectA1 = (SubjectInterface) new ProxyFactory(subjectA).getProxyInstance();
        subjectA1.println();
        subjectA1.println111();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值