现代生活节奏太快,很多事情我们不能亲力亲为,需要其他人帮我们处理一些繁琐的事情。例如:找房子,通过房屋中介可以更快的找到心仪的房子(前提是这房屋中介别太坑);喝多了找代理驾驶;找小明帮我抄作业(哈哈)等等。这些我们能做的事情但是不想去做的我们找其他人帮我们做,这些人就是代理(也就是代你做一些事情)。
Java是面向对象的世界,能够模拟我们现实生活。既然现实生活中用到了代理人,那么可不可以用到Java世界中来呢?当然是可以的。下面我们介绍静态代理模式。
静态代理模式。
核心思想
代理模式中有两类对象,一类是代理对象,一类是被代理对象。
代理对象和被代理对象需要实现相同的接口(也就是说他们有相同的方法)这是实现代理模式的重中之重。
代理对象中持有被代理对象的引用。可以通过构造函数或其他方法传递进来。
代理对象中实际运行的方法是被代理对象的方法。
假设模拟周杰伦开演唱会。周杰伦需要唱歌sing()和跳舞dance(),还需要和演唱会的运行商签约,演唱会开完会得到资金。
下面我们就模拟周杰伦开演唱会的场景。
代码:
public class StaticProxyTest {
public static void main(String[] args) {
Broker broker = new Broker(new Singer());
broker.singerSing();
}
}
/**
* 代理对象和被代理对象需要实现的接口
* @author Administrator
*
*/
interface Sing{
void singerSing();
void dance();
}
/**
* 被代理对象
* @author Administrator
*
*/
class Singer implements Sing{
@Override
public void singerSing() {
System.out.println("周杰伦 is singing!");
}
@Override
public void dance() {
System.out.println("周杰伦 can dance!");
}
}
/**
* 代理对象
* @author Administrator
*
*/
class Broker implements Sing{
//代理对象持有被代理对象的引用
private Sing sing;
//通过
public Broker(Sing sing) {
this.sing = sing;
}
public void before(){
System.out.println("经纪人代理签约");
}
public void after(){
System.out.println("经纪人代理收款");
}
@Override
public void singerSing() {
before();
sing.singerSing();
this.dance();
after();
}
@Override
public void dance() {
//调用被代理对象方法
sing.dance();
}
}
结果:
经纪人代理签约
周杰伦 is singing!
周杰伦 can dance!
经纪人代理收款
可以看到,当我们调用代理人Broker对象的sing()方法和dance()方法时,实际运行的是周杰伦Singer对象的sing()方法和dance()方法。代理对象只是调用Singer对象。并提供before()和after()方法,这样周杰伦的这样演唱会就结束了。周杰伦只做了2件事,那就是唱歌和跳舞。其他都是代理对象(经纪人做的)。
这种设计模式保证,一个对象只做一类件事,例如周杰伦只需要台上的任务(唱歌和跳舞),经纪人替周杰伦处理事务。