什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢,就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活。
被代理人和被代理人继承同一个接口(抽象角色):声明真实对象和代理对象的共同接口;
真实对象:实际上干活的那个人。
代理对象:代理对象内部包含对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,有相当于对真实对象进行了一次封装。
示例代码如下:
1.同一接口
package model;
/**
* 代理模式接口_抽象角色
* @author 张义
*
*/
public interface AgencyInterface {
/**
* 代理方法
*/
public void add();
}
2.
package model.impl;
import model.AgencyInterface;
/**
* 真实角色1
* @author 张义
*
*/
public class RealObjectImpl1 implements AgencyInterface{
/**
* 实现代理方法
*/
public void add() {
System.out.println(this.getClass().getName() + "执行代理方法");
}
}
3.package model.impl;
import model.AgencyInterface;
/**
* 真实角色2
* @author 张义
*
*/
public class RealObjectImpl2 implements AgencyInterface {
/**
* 实现代理方法
*/
public void add() {
System.out.println(this.getClass().getName() + "执行代理方法");
}
}
4.代理人角色
package model.impl;
import model.AgencyInterface;
/**
* 代理角色
* @author 张义
*
*/
public class AgencyObject implements AgencyInterface {
private AgencyInterface ai;
public AgencyObject(AgencyInterface ai){
this.ai = ai;
}
public AgencyObject(){
this.ai = new RealObjectImpl1();
}
/**
* 实现代理方法
*/
public void add() {
ai.add();
}
}
5.
package model.main;
import model.impl.AgencyObject;
import model.impl.RealObjectImpl2;
/**
* 客户端
* @author 张义
*
*/
public class Main {
public static void main(String[] args) {
// 代理方式1
AgencyObject ao1 = new AgencyObject();
ao1.add();
//代理方式2
AgencyObject ao2 = new AgencyObject(new RealObjectImpl2());
ao2.add();
}
}
6.代理模式主要使用了Java 的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清楚的很,因为我们继承同一个接口。