代理模式(Proxy Pattern)
代理模式是一种软件设计模式,为某个实现类(也称目标类或委托类)对象提供一个代理类,代理类通过控制该对象的访问可以为该对象中的方法增加额外的功能。
静态代理:
静态代理由一个接口、实现类(也称目标类或委托类)、代理类三部分组成,实现类和代理类均须实现接口中定义的抽象方法,不同之处在于,实现类负责实现主要的业务方法,代理类负责对实现类中的业务方法作“加强”处理:在调用的业务方法前后增加额外的处理。调用业务时,通过代理类对象调用代理类中接口实现方法,进而间接调用实现类中业务方法。
场景:
企业请明星唱歌或者导演请明星拍摄电影或电视剧,一般先通过其经纪人进行协商,然后由经纪人告知明星,明星同意后进行演出,最后经纪人处理善后事宜。示例如下:
/**
* 实现类(也称目标类或委托类)和代理类须实现的接口
*
* @author GaoHuanjie
*/
public interface IWork {
/**
* 唱歌方面
*
* @author GaoHuanjie
*/
void sing();
/**
* 演出(比如拍摄电影,演电视剧)方面
*
* @author GaoHuanjie
*/
void play(int option);
}
/**
* 实现类(也称目标类或委托类),该类实现IWork接口
*
* @author GaoHuanjie
*/
public class Star implements IWork{
private String name;//名字
public void setName(String name) {
this.name = name;
}
/**
* 唱歌方面,很有天赋,声音动听
*
* @author GaoHuanjie
*/
@Override
public void sing() {
try {
System.out.println(name+"正在唱歌......");
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 演出(比如拍摄电影,演电视剧)方面,惟妙惟肖,形象逼真
*
* @author GaoHuanjie
*/
@Override
public void play(int option) {
try {
switch (option) {
case 1:
System.out.println(name+"正在拍摄电影......");
break;
case 2:
System.out.println(name+"正在演电视剧......");
}
Thread.sleep(30000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 代理类,该类实现IWork接口
*
* @author GaoHuanjie
*/
public class Agent implements IWork{
private Star star;
public Agent(Star star) {
this.star = star;
}
/**
* 唱歌方面,谙熟与客户洽谈相关事宜
*
* @author GaoHuanjie
*/
@Override
public void sing() {
System.out.println("和客户协商,确定演出时间!");
System.out.println("和客户协商,确定演出地点!");
System.out.println("和客户协商,确定安保措施!");
System.out.println("和客户协商,确定出场费金额!");
star.sing();;//唱歌
System.out.println("收取客户出场费!");
}
/**
* 演出(比如拍摄电影,演电视剧)方面,谙熟与客户洽谈相关事宜
*
* @author GaoHuanjie
*/
@Override
public void play(int option) {
System.out.println("和导演协商,确定扮演角色!");
System.out.println("和导演协商,确定拍摄时段!");
System.out.println("和导演协商,确定拍摄地点!");
System.out.println("和导演协商,确定安保措施!");
System.out.println("和导演协商,确定片酬!");
star.play(option);//演出
System.out.println("收取导演片酬!");
}
}
public class Test {
public static void main(String[] args) {
Star atar = new Star();
atar.setName("刘德华");
Agent agent = new Agent(atar);
agent.sing();
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~");
agent.play(1);
}
}
注意:
1、所谓静态是指程序运行前代理类对应字节码文件已经存在,且代理类和委托类的关系已经确定了。
2、代理类和委托类有共同的父类或父接口。
3、实现类和代理类实现同一个接口,所以实现类和代理类拥有相同的方法。明星会演戏,那么经纪人必须擅长和导演洽谈相关事宜,你想啊,刘德华会演电影,那为什么不找你当他经纪人,很简单嘛,一句话你会这方面的业务流程吗?
【Demo下载】