设计模式之代理模式

代理模式从字面的含义上来讲就是找一个中介作为代理,对某些方法或服务进行增强,降低代码的耦合性。主要有三种代理模式

一.静态代理:静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。

1.先创建提供服务的接口,作为源头

package Proxy_design;
//提供服务本体
public interface SomeService {
    String doFirst();
    void doSecond();
}

2.实现服务接口,作为提供服务的本体

public class SomeServiceImpl implements SomeService {
    @Override
    public String doFirst() {
        System.out.println("执行doFirst()方法");
        return "abcde";
    }

    @Override
    public void doSecond() {
        System.out.println("执行doSecond()方法");
    }
}

3.创建代理类,增强服务接口中的方法

public class SomeServiceProxy implements SomeService {
    //创建代理目标对象
    private SomeService target;

    public SomeServiceProxy() {
        target=new SomeServiceImpl();
    }

    @Override
    public String doFirst() {
//        代理类调用目标方法
        String result = target.doFirst();
//        对目标方法进行增强
        return result.toUpperCase();
    }

    @Override
    public void doSecond() {
        target.doSecond();
    }
}

4.创建一个测试类

public class MyTest {
    public static void main(String[] args) {
        SomeService someService = new SomeServiceProxy();
        String result = someService.doFirst();
        System.out.println("result=" + result);
        someService.doSecond();
    }
}

运行结果:

代理类主要实现了服务接口的方法,然后通过new一个被代理类的对象,对被代理类的方法进行增强,然后在调用的时候,new一个代理类的对象,即可以调用增强后的方法。下面的图是对这整个过程底层实现的描述。首先最先进入栈的是main方法,然后调用代理类中的doFirst方法,然后再进一步调用被代理类中的doFirst方法,然后被代理类返回abcde,出栈,这时候代理类对其进行增强,然后再出栈,然后就传递给main方法,这时候就是ABCDE。

posted @ 2018-08-27 21:31  白晨冬阳  阅读(82)  评论(0编辑  收藏  举报