代理模式有两种主题,一种是真实主题(真正做事的),一种是代理主题(真实主题的代理,可以帮助真实主题做一些辅助功能,使得真实主题只用关心核心实现)。下面我用一个歌手唱歌的例子来实现代理模式。事情是这样的,你想找一个歌手为你唱一首歌,但是歌手的所有活动都需要他的经纪人来安排。所以你必须联系他的经纪人,由经纪人做一些事情然后再将任务交给歌手。下面我们来实现下代码
注意 真实主题和代理主题需要实现相同的接口。
1 新建真实主题和代理主题的公用接口‘’
public interface ISing {
void sing();
}
2 新建一个 歌手类 和一个歌手经纪人类
/**
* 我是歌手 我只负责唱歌
*/
public class Singer implements ISing{
@Override
public void sing() {
System.out.println("咚次哒次,咚次哒次。苍茫的天涯是我的爱,绵绵的青山脚下花正开...");
}
}
/**
* 我是歌手的经纪人,我会帮他安排所有的活动,你要想联系歌手就来找我吧
*/
public class SingerAgent implements ISing{
//这是我代理的歌手
Singer singer = null;
@Override
public void sing() {
if(!preSing()){
return;
}
if(singer == null){
singer = new Singer();
}
singer.sing();
}
private boolean preSing() {
Date date =new Date();
@SuppressWarnings("deprecation")
int time = date.getHours();
if(time<10 || time >17){
System.out.println("很遗憾,我的歌手下班了,不能为你唱歌了。");
return false;
}
return true;
}
}
3 新建测试类
public class ProxyTest {
public static void main(String... a){
//要想找歌手为你唱歌,我必须去找他的经纪人
SingerAgent agent = new SingerAgent();
//向经纪人发起一次唱歌的请求
agent.sing();
}
}
输出结果
很遗憾,我的歌手下班了,不能为你唱歌了。
很遗憾,歌手暂时不能为你唱歌,你可以在每天的 10点到17点去找他的经纪人。