SSM之静态代理

(1)接口

package com.myproject;
//主业务接口
public interface ISomeService{
    //目标方法
    String doFirst();
    void doSecond();
}

(2)接口的实现

public class SomeServiceImpl implements ISomeService {

    public String doFirst() {
        System.out.println("执行doFirst()方法");
        return "abcde";
    }

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

}

(3)静态dai代理

package com.myproject.proxy;

import com.myproject.ISomeService;
import com.myproject.SomeServiceImpl;
/*(1)动态代理要和目标对象共同实现一个接口,也就是类似于,打官司,请的律师和诉讼者共同做一件事,就是打官司。
 * (2)下面的这个方法就是代理类
 * **/
public class SomeServiceProxy implements ISomeService{

    public String doFirst() {
        //律师可以调用当事人,叫当事人说明情况;代理类看目标对象有哪些需要增强的地方并且进行增强。
        //什么叫增强,就是做你做不来或者做不了的事情,你自己会做,我就不帮你做
        //先访问目标对象,定义一个目标对象,创建目标对象
    /**    ISomeService target=new SomeServiceProxy();
     * 注意:律师刚刚来,先了解案情,才开始代理。
     * 你这个就是已经开始代理了,所以错误。
     */
    //先进行访问
    ISomeService target=new SomeServiceImpl();
    //代理类调用目标方法
    String result=target.doFirst();
    //增强就发生在这里
    return result.toUpperCase();
    }

    public void doSecond() {
        //doSecond是不需要进行代理的,可以直接在MyTest里面直接:ISomeService target=new SomeServiceImpl();然后再,target.doSecond();既可以。
        //doSecond呢是自己能够做的了,所以就是不需要进行代理了。
        ISomeService target=new SomeServiceImpl();
    }

}
 

(4)测试

package com.myproject.test;

/**
 * 变更需求二:我要求result返回的是大写,直接是大写,不允许进行result.toUpperCase();
 * 
 * */

import com.myproject.ISomeService;
import com.myproject.SomeServiceImpl;
import com.myproject.proxy.SomeServiceProxy;

public class MyTest {
    /**
     * public static void main(String[] args) { ISomeService service=new
     * SomeServiceImpl(); String result =service.doFirst();
     * System.out.println("result="+result); service.doSecond(); }
     */
    public static void main(String[] args) {
        // 现在已经是上法庭了,那么就不能是当事人上法庭了,而是他的律师、代理类,所以下面需要更改一下:
        // ISomeService service=new SomeServiceImpl();
        ISomeService service = new SomeServiceProxy();
        String result = service.doFirst();
        System.out.println("result=" + result);
        ISomeService target=new SomeServiceImpl();
        target.doSecond();
    }

}
 

(5)代码优化

package com.myproject.proxy;

import com.myproject.ISomeService;
import com.myproject.SomeServiceImpl;

public class SomeServiceProxy implements ISomeService{
    private ISomeService target;
    public SomeServiceProxy(){
        //代理律师来了,我先进行了解情况
        target=new SomeServiceImpl();
    }
    public String doFirst() {
        //了解清楚以后我再调用方法
        String result=target.doFirst();
        return result.toUpperCase();
    }

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

--------------------------------------

package com.myproject.Test;

import com.myproject.ISomeService;
import com.myproject.SomeServiceImpl;
import com.myproject.proxy.SomeServiceProxy;

public class Test {
//测试类
    
    public static void main(String []args){
/**
* 我现在使用的是代理类,也就是律师,那么我就不需要你本人来实现了,所以在这里就不用ISomeService service=new SomeServiceImpl();
* 因为我在访问你的时候我已经然你交代我很清楚了
*/
    ISomeService service=new SomeServiceProxy();
    String result =service.doFirst();
    System.out.println(result);
    service.doSecond();
    //注意:这里,我要想输出doFirst()以及doSecond那么就得采用两个对象,这样代码还是有一定的缺陷的。因为我是一个当事者,当事者理应只有一个对象才合适呢
    //解决办法:把ISomeService target变成成员变量,并且把target=new SomeServiceImpl();放在无参构造器里面随着函数的创建而创建
}
}

 

OK了!

你可能感兴趣的:(J2EE)