静态代理模式

现代生活节奏太快,很多事情我们不能亲力亲为,需要其他人帮我们处理一些繁琐的事情。例如:找房子,通过房屋中介可以更快的找到心仪的房子(前提是这房屋中介别太坑);喝多了找代理驾驶;找小明帮我抄作业(哈哈)等等。这些我们能做的事情但是不想去做的我们找其他人帮我们做,这些人就是代理(也就是代你做一些事情)。

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件事,那就是唱歌和跳舞。其他都是代理对象(经纪人做的)。

这种设计模式保证,一个对象只做一类件事,例如周杰伦只需要台上的任务(唱歌和跳舞),经纪人替周杰伦处理事务。

你可能感兴趣的:(代理模式,设计模式)