代理模式(静态代理)
Posted zpkang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式(静态代理)相关的知识,希望对你有一定的参考价值。
代理模式(静态)
定义:
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。一般我们写代码的时候, 对已经存在的代码尽量不要在修改了, 因为可能好多地方都调用这个方法, 改掉之后可能会出问题, 但是我们可以使用代理对象调用之前的方法进行内容扩充.
意图:
为其他对象提供一种代理以控制对这个对象的访问。
主要解决:
在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
应用实例:
-
Windows 里面的快捷方式。
-
猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。
-
买火车票不一定在火车站买,也可以去代售点。
-
一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。
-
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
后期维护
优点
- 职责清晰。
- 高扩展性。
- 智能化。
缺点
- 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
- 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
- 静态代理的代码量比较大
总结
例如我们在调用service的时候, service层的一个现有存在的方法和现在的需求很相似, 但是我们不能对其更改, 因为在所有使用这个方法的地方都有可能出问题, 这时候我们就可以创建一个serviceProxy对象, 去实现之前service的接口, 在代理对象里面调用之前service的方法, 就可以不改变原有代码的情况下, 实现代码的复用
以上是关于代理模式(静态代理)的主要内容,如果未能解决你的问题,请参考以下文章