设计模式——代理模式

144 阅读2分钟

定义:

给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。

使用场景:

  1. 当业务无法直接访问某个类时,需要一个代理类去代理访问。
  2. 当需要横向添加一些功能,比如日志功能时,可以使用代理模式。

优点:

  1. 可以使真实业务角色责任更纯粹,不用包含一些公共业务。
  2. 公共业务交给了代理类,实现了解耦。
  3. 提供了面向切面编程的基础,使一个横向业务更容易编写
  4. 动态代理可以代理多个实现了同一个接口的类。

缺点:

增加代理类可能会导致业务处理速度变慢,使代码结构更复杂。

代码实例:

网络已经是现在人离不开的东西了,我们每天都要上网浏览信息。上网的方式也很简单。但是,当我们要访问一些国外的网站时,就发现访问不了了。这时候就出现了一些VPN,他可以帮助我们去访问一些国内不能访问的网站,也就是说他代理了这个访问过程,把结果返回给了我们。 这就是代理模式。

public interface Web {
​
    // 处理请求
    void processRequest();
    
}

public class Bilibili implements Web{
​
    @Override
    public void processRequest() {
        System.out.println("你正在访问哔哩哔哩");
    }
}

public class Client {
​
    public static void main(String[] args) {
        Web web = new Bilibili();
        web.processRequest();
    }
}

//国内无法访问的网站类
public class Youtube implements Web{
​
    @Override
    public void processRequest() {
        System.out.println("你正在访问youtube");    
    }
    
}

//VPN模拟代理对象
public class VPN implements Web{
​
    private Web web;
​
    public VPN() {
    }
​
    public void setWeb(Web web) {
        login();
        charge();
        this.web = web;
        close();
    }
​
    @Override
    public void processRequest() {
        web.processRequest();
    }
​
    private void login() {
        System.out.println("登录VPN");
    }
​
    private void charge() {
        System.out.println("给VPN充值");
    }
​
    private void close() {
        System.out.println("关闭VPN");
    }
}


//通过VPN 我们可以访问YouTube 也就是通过代理我们可以访问无法访问的对象
public class Client {
​
    public static void main(String[] args) {
        Web web = new Youtube();
        VPN vpn = new VPN();
        vpn.setWeb(web);
        vpn.processRequest();
    }
}