定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用
这样说你可能不知道什么意思,代理这个词还是比较好理解的,现在代购盛行,一个TF口红在日韩买可能便宜很多,但是你又不方便过去买,那么就要找代购,于是在你和要买的TF之间就存在一个代购,由代购负责买家是谁,和这个买家要买什么,这就是代购代理,再比如你要租一个房子,但是你不知道去哪里租哪里找房东,这时候就需要中介牵线,再比如古代男婚女嫁,父母之命媒妁之言,在媒婆两家上门说媒之前,两家都是基本没有见面相谈。
优点:避免直接访问对象造成的复杂性
这样买家和买TF口红就减小了耦合性,减少耦合性的好处是什么,从代购模式你就知道,不用跑到当地买啦,简单方便,缺点就是代购的价钱比你直接买贵点,(复杂度请求速度变慢)所以真的有人跑到国外去买哦,这当然是仁者见仁智者见智了,实际上如果是大部分人都跑到当地去买,会导致当地游客膨胀,中国人嘛,抢购高手,增加了混乱度,所以大部分人还是选择代购模式,适合多物品购买的模式。
【静态代理】
代码实现:
首先定义一个接口事件,事件是要买一个TF口红
public interface Event {
public void buyTF();
}
然后就是客户我,需要实现这个接口,我要买一个TF口红。
public class Client implements Event {
@Override
public void buyTF() {
System.out.println("I want a TF lipstick");
}
}
代理:在代理里面引用实际实例,顺便替我打包快递
public class Proxy implements Event {
@Override
public void buyTF() {
//引用创建真实实例
Client me=new Client();
//调用真实用例方法
me.buyTF();
//代理商快递回来
express();
}
public void express(){
System.out.println("快递回来");
}
}
代理模式:相当于管代理人的公司,这里面任务单独分给专门的代理,不会暴漏客户对象。
运行结果为:
如果我想在买之前添加一个日志代理类和权限代理类呢:那么代码现在更改为
买东西的接口
package StaticProxy;
public interface BuyInterface {
public void buyTF();
}
买TF的客户
package StaticProxy;
public class TFClient implements BuyInterface {
@Override
public void buyTF() {
System.out.println("I want a TF lipstick");
}
}
权限代理
package StaticProxy;
public class ClientAuthProxy implements BuyInterface {
private BuyInterface buyInterface;
public ClientAuthProxy (BuyInterface buyInterface){
this.buyInterface=buyInterface;
}
@Override
public void buyTF() {
System.out.println("开始验证权限");
buyInterface.buyTF();
System.out.println("结束验证权限");
}
}
日志代理:
package StaticProxy;
import com.sun.org.apache.xml.internal.resolver.helpers.PublicId;
public class ClientLogProxy implements BuyInterface {
private BuyInterface buyInterface;
public ClientLogProxy (BuyInterface buyInterface){
this.buyInterface=buyInterface;
}
@Override
public void buyTF() {
System.out.println("开始打印日志");
buyInterface.buyTF();
System.out.println("结束打印日志");
}
}
调用运行:
public class MainControl {
public static void main(String[] args) {
TFClient me=new TFClient();
ClientAuthProxy clientAuthProxy=new ClientAuthProxy(me);
ClientLogProxy clientLogProxy=new ClientLogProxy(clientAuthProxy);
clientLogProxy.buyTF();
}
}
运行结果: