设计模式-代理模式

Posted kcenyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-代理模式相关的知识,希望对你有一定的参考价值。

为了理解Spring中的核心之一AOP,学习该代理模式

静态代理模式的好处:
可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
公共业务发生扩展时,方便集中管理!
代理模式的缺点
一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率会变低

静态代理

案例1:租房

  • 图示

  • 需要实现的接口

// 租房案例
public interface Rent 
    void rent();

  • 真实对象:房东
// 房东
public class Host implements Rent 
    @Override
    public void rent() 
        System.out.println("房东想出租房子");
    

  • 代理对象:中介
public class HostProxy implements Rent 

    private Host host;

    public HostProxy() 
    

    public HostProxy(Host host) 
        this.host = host;
    

    @Override
    public void rent() 
        host.rent();
        check();
        sign();
    

    public void check() 
        System.out.println("中介带租客看房");
    

    public void sign() 
        System.out.println("中介与租客签合同");
    
	

  • 客户租房
public class Client 
    public static void main(String[] args) 
        // 被代理的对象:要出租房屋的房东
        Host host = new Host();

        // 代理对象:中介。
        // 除了帮助房东完成出租任务,还会进行看房、签合同操作
        HostProxy hostProxy = new HostProxy(host);

        // 租客不需要面对房东,找到中介即可完成租房
        hostProxy.rent();
    

案例2:助理老师上课

  • 需要实现的接口
public interface ITeacherDao 
    void teach();

  • 真实对象:老师
public class TeacherDao implements ITeacherDao 
    @Override
    public void teach() 
        System.out.println("老师授课中......");
    

  • 代理对象:助理老师
public class TeacherDaoProxy implements ITeacherDao 

    private ITeacherDao target;

    public TeacherDaoProxy(ITeacherDao target) 
        this.target = target;
    

    @Override
    public void teach() 
        System.out.println("授课前准备");
        target.teach();
        System.out.println("准备");
    

  • 助理老师上课
public class Client 
    public static void main(String[] args) 
        // 被代理对象:原来的老师
        TeacherDao teacherDao = new TeacherDao();

        // 代理对象:助理老师
        TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);

        teacherDaoProxy.teach();
    

动态代理的好处:
可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
公共业务发生扩展时,方便集中管理!
一个动态代理类代理的是一个接口,一般就是对应的一类业务
只要是实现了同一个接口,一个动态代理类就可以代理多个类

动态代理

动态代理中的代理对象由代理工厂生成

案例:助理老师sayHello

  • 需要实现的接口
public interface ITeacherDao 
    void sayHello(String name);
```
  • 老师
public class TeacherDao implements ITeacherDao 
    @Override
    public void sayHello(String name) 
        System.out.println("hello " + name + "!");
    

  • 核心:代理工厂
public class ProxyFactory 

    private Object target;

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

    /*
    public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)

    ClassLoader loader 被代理对象,即目标对象的类加载器
    Class<?>[] interfaces  被代理对象,即目标对象实现的接口
    InvocationHandler h 执行被代理对象的方法时,会把当前执行的被代理对象方法作为参数传入
     */

    public Object getProxyObject() 
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() 
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
                        System.out.println("两人遇到了");
                        Object returnValue = method.invoke(target, args);
                        System.out.println("打招呼结束");
                        return returnValue;
                    
                );
    

  • 测试一下
public class Client 
    public static void main(String[] args) 
        // 创建被代理对象
        TeacherDao teacherDao = new TeacherDao();

        // 给被代理对象创建代理对象
        ITeacherDao proxyObject = (ITeacherDao) new ProxyFactory(teacherDao).getProxyObject();

        proxyObject.sayHello("Tom");
    

以上是关于设计模式-代理模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式——代理模式

设计模式代理模式 ( 代理模式结构 | 客户端 | 主题对象 | 被代理对象 | 代理对象 )

设计模式-代理模式

代理的模式和原理(代理的模式有几种)

设计模式 结构型模式 -- 代理模式模式实例:日志文件

设计模式之代理模式