Proxy代理模式

代理模式所讲的就是现实生活中的这么一个概念:中介。

代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

代理模式有几种,虚拟代理,计数代理,远程代理,动态代理。

主要分为两类,静态代理和动态代理。

角色:

ISubject:抽象主题角色,是一个接口。该接口是对象和它的代理共用的接口。

RealSubject:真实主题角色,是实现抽象主题接口的类。

Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。代理对象提供与真实对象相同的接口,以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。 实现动态代理的关键技术是反射。

静态代理

静态代理比较简单,是由程序员编写的代理类,并在程序运行前就编译好的,而不是由程序动态产生代理类,这就是所谓的静态。 考虑这样的场景,管理员在网站上执行操作,在生成操作结果的同时需要记录操作日志,这是很常见的。此时就可以使用代理模式,代理模式可以通过聚合和继承两种方式实现:

/**方式一:聚合式静态代理 
 * @Since 2016年9月7日 
 */  
//1.抽象主题接口  
public interface Manager {  
    void doSomething();  
}  
//2.真实主题类  
public class Admin implements Manager {  
    public void doSomething() {  
        System.out.println("Admin do something.");  
    }  
}  
//3.以聚合方式实现的代理主题  
public class AdminPoly implements Manager{  
    private Admin admin;  

    public AdminPoly(Admin admin) {  
        super();  
        this.admin = admin;  
    }  

    public void doSomething() {  
        System.out.println("Log:admin操作开始");  
        admin.doSomething();  
        System.out.println("Log:admin操作结束");  
    }  
}  
//4.测试代码  
        Admin admin = new Admin();  
        Manager m = new AdminPoly(admin);  
        m.doSomething();  
//方式二:继承式静态代理  
//与上面的方式仅代理类和测试代码不同  
//1.代理类  
public class AdminProxy extends Admin {  
    @Override  
    public void doSomething() {  
        System.out.println("Log:admin操作开始");  
        super.doSomething();  
        System.out.println("Log:admin操作开始");  
    }  
}  
//2.测试代码  
        AdminProxy proxy = new AdminProxy();  
        proxy.doSomething();  

动态代理

一般来说,对代理模式而言,一个主题类与一个代理类一一对应,这也是静态代理模式的特点。 但是,也存在这样的情况,有n各主题类,但是代理类中的“前处理、后处理”都是一样的,仅调用主题不同。也就是说,多个主题类对应一个代理类,共享“前处理,后处理”功能,动态调用所需主题,大大减小了程序规模,这就是动态代理模式的特点。