2018.3.6 SSM 前言完结

  前言:在学习SSM之前,感觉自己还是跟着视频走吧,毕竟自己不是大神,所以,在学习SSM之前 我就学习一些的比较重要的内容,三大代理模式,适配器模式,模板方法。自我感觉这些还是非常重要的,在网上也了解他的重要性。

   三大代理模式:

 <1>静态代理模式:

       通过另一个类来增强目标类的模式,但是目标类必须实现相同的接口或者是继承相同父类.

代码实例

1)定义一个接口点击打开链接

package com.gavin.service;

public interface ISomeService {
	String doFirst();
	void doSecond();
}
2)目标类必须实现接口
package com.gavin.service;

public class ISomeServiceImpl implements ISomeService{

	@Override
	public String doFirst() {
		return "abcde";
	}

	@Override
	public void doSecond() {
	}
}

3)代理类

package com.gavin.service;

public class SomeServiceProxy implements ISomeService {

	@Override
	public String doFirst() {
		ISomeService target = new ISomeServiceImpl();
		String result = target.doFirst();
		return result.toUpperCase();
	}

	@Override
	public void doSecond() {
		
	}

}

4)测试类

package com.gavin.test;

import com.gavin.service.ISomeService;
import com.gavin.service.SomeServiceProxy;

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

总结:

   静态代理模式就是本来一个实现类就这样运行,但是通过一个代理类就把他间接在代理类内部实现增强了,所以在需要的时候就变了。但也缺点,就是目标类很多,就会使代码变得累赘。增加维护成本。

<2>JDK动态代理

   通过JDK自带得方法来实现代理,但是目标类不能实现接口

   代码示例:

在测试类实现JDK动态代理

package com.gavin.test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.gavin.service.ISomeService;
import com.gavin.service.SomeServiceImpl;

/**
 * 此类是测试JDK动态代理的测试
 * @author Gavin
 *
 */
public class Test {

	public static void main(String[] args) {
		//使用JDK动态代理时,必须实现目标类接口
		//因为其底层实现流程和静态代理是一致的
		SomeServiceImpl target = new SomeServiceImpl();
		ISomeService iSomeService = (ISomeService) Proxy.newProxyInstance(
				target.getClass().getClassLoader(),//加载类类加载器
				target.getClass().getInterfaces(),//获取被代理类的所有接口信息
				new InvocationHandler() {
					/*
				        proxy 代理对象
					method 目标方法
					args 参数
					*/
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						// TODO Auto-generated method stub
						Object result = method.invoke(target, args);
						if (result != null) {
							result = ((String) result).toUpperCase();
						}
						return result;
					}
				});
		String result = iSomeService.doSecond();
		System.out.println(result);
	}
}
2)目标类
package com.gavin.service;

public class SomeServiceImpl implements ISomeService{

	@Override
	public void doFirst() {
		// TODO Auto-generated method stub
	}

	@Override
	public String doSecond() {
		// TODO Auto-generated method stub
		System.out.println("执行doSecond()");
		return "abcde";
	}

}
3)必须要实现得接口
package com.gavin.service;

public interface ISomeService {
	void doFirst();
	String doSecond();
}
ps:一定要实现接口

<3>Cglib动态代理

  通过第三方工具实现动态代理,所需JAR包已经在前面写出

  代码示例

1)代理工厂

package com.gavin.Factory;

import java.lang.reflect.Method;

import com.gavin.service.SomeService;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibFactory implements MethodInterceptor{
	
	public SomeService myCglibCreator(){
		//创建增强器对象
	    Enhancer enhancer = new	Enhancer();
	    //指定目标类 即父类
	    enhancer.setSuperclass(SomeService.class);
	    //设置回调接口对象
	    enhancer.setCallback(this);
		return (SomeService) enhancer.create();
	}

	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        SomeService someService = new SomeService();
		Object result = method.invoke(someService, args);
		if (result != null) {
			result = ((String) result).toUpperCase();
		}
		return result;
	}
}
package com.gavin.test;
//测试类
import com.gavin.Factory.CglibFactory;
import com.gavin.service.SomeService;

public class MyTest {
	public static void main(String[] args) {
		SomeService service = new CglibFactory().myCglibCreator();
		System.out.println(service.doFirst());
	}
}
3)目标类
package com.gavin.service;

public class SomeService {
	
	public String doFirst() {
		return "abcde";
	}
	
	public void doSecond() {
	}
}

总结:

  既能代理又接口的目标类,又能实现没有接口的类,有接口的情况可以自己修改即可

总的来说,增强一个类,就有三种途径,视情况考虑


适配器模式

 在这里没有作详细的总结 就贴出比较经典的总结

http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html


模板方法

https://www.cnblogs.com/meet/p/5116417.html




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值