代理模式(静态代理)

Posted zpkang

tags:

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

代理模式(静态)

定义:

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。一般我们写代码的时候, 对已经存在的代码尽量不要在修改了, 因为可能好多地方都调用这个方法, 改掉之后可能会出问题, 但是我们可以使用代理对象调用之前的方法进行内容扩充.

意图:

为其他对象提供一种代理以控制对这个对象的访问。

主要解决:

在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

应用实例:

  1. Windows 里面的快捷方式。

  2. 猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。

  3. 买火车票不一定在火车站买,也可以去代售点。

  4. 一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。

  5. spring aop。

代码案例:

例如租房: 客户只需要租房, 不想一直找房, 看房以及后期的维护, 这时候可以找中介公司, 中介公司负责这些工作, 中介帮你找房东出租房子, 以此负责之后的维护工作等. 这里的中介起到的就是代理作用

技术图片

原理:

创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法。

代码

1.出租房子

com.test.Rent

// 出租房子
public interface Rent {
    // 给了钱返回房子
    Object rent(Object money);
}

2.业主(要出租房屋的人

com.test.Host

// 业主, 出租房子
public class Host implements Rent {
    @Override
    public Object rent(Object money) {
        System.out.println("业主(真实对象): 房屋出租成功...价钱" + money);
        return new Object(); // 假如Object就是出租的房子
    }
}

3.代理(中介公司)

你只需要找中介租房即可, 不需要直接找业主

com.test.Proxy

// 代理, 中介公司
public class Proxy implements Rent {

    // 提供真实对象, 被代理的对象
    private Rent host = new Host();

    @Override
    public Object rent(Object money) {
        // 1. 约时间
        time();
        // 2. 看房子
        seeHouse();
        // 3. 讲价钱, 签协议
        killPrice();
        // 调用业主的方法进行出租
        Object house = host.rent(money);
        // 4. 后期维护
        weihu();
        return null;
    }
    public void time() {
        System.out.println("约时间");
    }
    public void seeHouse() {
        System.out.println("看房子");
    }
    public void killPrice() {
        System.out.println("讲价钱, 签协议");
    }
    public void weihu() {
        System.out.println("后期维护");
    }
}

4.客户租房子

com.test.Customer

// 客户, 要租房子
public class Customer {
    public static void main(String[] args) {
        // 找中介
        Rent agent = new Proxy();
        // 租房
        agent.rent(3000);
    }
}

结果:

约时间
看房子
讲价钱, 签协议
业主(真实对象): 房屋出租成功...价钱3000
后期维护

优点

  1. 职责清晰。
  2. 高扩展性。
  3. 智能化。

缺点

  1. 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
  2. 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
  3. 静态代理的代码量比较大

总结

例如我们在调用service的时候, service层的一个现有存在的方法和现在的需求很相似, 但是我们不能对其更改, 因为在所有使用这个方法的地方都有可能出问题, 这时候我们就可以创建一个serviceProxy对象, 去实现之前service的接口, 在代理对象里面调用之前service的方法, 就可以不改变原有代码的情况下, 实现代码的复用

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

代理模式之静态代理实现代码

设计模式代理模式 ( 静态代理 )

Spring之代理模式

代理模式(动态)

Spring之静态/动态代理模式

静态代理模式代码演示