静态代理模式

静态代理模式,为其他对象提供一种代理来控制对这个对象的访问。

代理,顾名思义,就好比如明星的经纪人可以代理他处理一些业务上的事情,再比如你领取快递,几乎都是通过一些代理点领取,应该没人到总部领取吧。

UML:

共用的接口(Subject):RealSubject和Proxy的共用接口

RealSubject: 定义了Proxy所代表的真实实体

Proxy类:保存一个RealSubject引用使得代理可以访问实体,并提供一个与RealSubject的接口相同的接口,来代理实体

例子:王五(RealSubject)让保姆(Proxy)代理自己赵六超市(Supermarket)去买个西瓜(IBuyWatermelon)

Supermarket

package com.magggie.proxy;

public  class Supermarket {
     private String name;

    public String getName() {
         return name;
    }

    public  void setName(String name) {
         this .name = name;
    }

    public Supermarket(String name) {
         super ();
         this .name = name;
    }

    public Supermarket() {
         super ();
    }
    
}

IBuyWatermelon():共用的接口

package com.magggie.proxy;

public  interface IBuyWatermelon {
     // 代理事件
    public  abstract  void buyWatermelon();
}

RealSubjec():被代理者

package com.magggie.proxy;

public  class RealSubject implements IBuyWatermelon{
     private Supermarket supermaket;
    
    public RealSubject(Supermarket supermaket) {
         super ();
         this .supermaket = supermaket;
    }

    public RealSubject() {
         super ();
         // TODO Auto-generated constructor stub 
    }

    @Override
    public  void buyWatermelon() {
        System.out.println( "在"+supermaket.getName()+"买西瓜" );
    }

}

Proxy:代理者

package com.magggie.proxy;

public  class Proxy implements IBuyWatermelon{
    RealSubject wangWu; // 持有RealSubject的引用
 //     在构造函数时new出RealSubject 
    public Proxy(Supermarket supermarket) {
        wangWu = new RealSubject(supermarket);
    }


    @Override
    public  void buyWatermelon() {
 // 在方法里调用realsubject的方法
        wangWu.buyWatermelon();
    }

}

Client调用

package com.magggie.proxy;

public  class Client {

    public  static  void main(String[] args) {
        Supermarket zhaoLiu = new Supermarket();
        zhaoLiu.setName( "赵六超市" );
        
        Proxy hourseKeeper = new Proxy(zhaoLiu);
        
// 从代理模式可以看出,在客户端只调用Proxy,并没有出现RealSubject 
        hourseKeeper.buyWatermelon();
    }

}

输出

在赵六超市买西瓜

代理模式使得隐藏了RealSubject,有起到安全的作用,实际上有安全代理,用来控制真实对象访问时的权限,还有远程代理,虚拟代理,智能指引等。

但是当静态代理模式需要代理的方法越来越多时,代码量就越来越多,而且是很傻瓜式地调用RealSubject的方法。

因此动态代理模式出现了。

原文地址:https://www.cnblogs.com/maggiejyt/p/7568306.html