java设计模式之代理模式

一:代理模式

     在我们日常生活中,代理模式时时存在,比如我们购买商品,你不会直接去相应的工厂购买,而是通过代理,比如淘宝代理商,小区超市等代理商购买,而不会接触到真实的供应商完全由代理商转发我们的需求。代理模式使用对象聚合的方式代替继承从而降低模块间的耦合。

二:静态代理

  我们首先使用静态代理来实现消费者通过代理商购买商品的行为。

 2.1 定义接口

//红酒接口
public interface IRedWine {

	//红酒生产
	public void product();
	
	//红酒销售
	public void sell();
}

   2.2 接口实现类

public  class RealRedWineFactory implements IRedWine {

	@Override
	public void product() {
		System.out.println("红酒生产...");
	}

	@Override
	public void sell() {
		System.out.println("红酒销售...");
	}

}

    2.3 静态代理类

package com.travelsky.pss.tanjie.staticstate.proxy;

public class RedWineProxy implements IRedWine {

	// 静态代理类持有红酒生产接口类的实例
	private IRedWine ireaWine;

	public RedWineProxy(IRedWine ireaWine) {
		this.ireaWine = ireaWine;
	}

	@Override
	public void product() {
		System.out.println("静态代理类执行红酒生产.......");
		ireaWine.product();
	}

	@Override
	public void sell() {
		System.out.println("静态代理类执行红酒销售.......");
		ireaWine.sell();
	}

}

   2.4 测试类

package com.travelsky.pss.tanjie.staticstate.proxy;

public class StaticProxyMain {
	
	public static void main(String[] args) {
		IRedWine iRedWine = new RealRedWineFactory();
		//创建代理对象实例
		RedWineProxy proxy = new RedWineProxy(iRedWine);
		proxy.product();
		proxy.sell();
	}

}

////////////////测试效果///////////////////////////////////////////
静态代理类执行红酒生产.......
红酒生产...
静态代理类执行红酒销售.......
红酒销售...

    上面的实现是一个非常简单的静态代理模式实现,下面我们开始接触动态代理。

 三:动态代理

       3.1 JDK动态代理实现

     动态代理是在运行时生成代理对象,使用java.lang.reflect.Proxy生成动态代理对象时需要实现接口,以及InvacationHandler接口的真实处理对象handler给它。实际的行为处理由真实对象handler处理。

  3.1.1 接口定义

package com.travelsky.pss.tanjie.dynamic.proxy;

//JDK动态代理
public interface UserService {

    void addUser();
}

 3.2.2 接口实现

package com.travelsky.pss.tanjie.dynamic.proxy;

public class UserServiceImpl implements UserService {

	@Override
	public void addUser() {
		System.out.println("代理类实现....");
	}

}

 3.3.3 JDK动态代理实现

package com.travelsky.pss.tanjie.dynamic.proxy;

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

//JDK动态代理,在运行时,为那些没有统一的接口支持的类提供代理
public class MyInvcationHandler implements InvocationHandler {

	private Object target;

	public MyInvcationHandler(Object target) {
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("在代理之前............");
		Object obj = method.invoke(target, args);
		System.out.println("在代理之后............");
		return obj;
	}

	// 获取目标对象的代理对象
	public Object getProxy() {
		return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(),
				this);
	}
}

 3.3.4 测试效果

package com.travelsky.pss.tanjie.dynamic.proxy;

public class DynamicProxyMain {

	public static void main(String[] args) {

		UserService service = new UserServiceImpl();
		
		MyInvcationHandler handler = new MyInvcationHandler(service);
		
		UserService userService = (UserService) handler.getProxy();
		
		userService.addUser();
	}

}

//////////////////////////运行效果////////////////////////////////
在代理之前............
代理类实现....
在代理之后............

 四:Cglib实例类的动态代理

 对于未实现接口的类想进行代理的话可以使用cglib来实现

 4.1 接口

 

package com.travelsky.pss.tanjie.cglib.proxy;

public interface StudyJavaProxyCglib {

	  public void beginStudyJavaProxy(); 
	  
}

 4.2 类实现

 

package com.travelsky.pss.tanjie.cglib.proxy;

//代理类,不实现接口
public class StudyJavaProxyCglibImpl {

	public void beginStudyJavaProxy() {  
        System.out.println("开始学习设计模式");  
    }  
	
}

 4.3 cglib代理实现

 

package com.travelsky.pss.tanjie.cglib.proxy;

import java.lang.reflect.Method;

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

public class StudyJavaProxyCglibBridge implements MethodInterceptor {  
    private Object target;  
  
    /** 
     * 创建代理对象 
     *  
     * @param target 
     * @return 
     */  
    public Object getInstance(Object target) {  
        this.target = target;  
        Enhancer enhancer = new Enhancer();  
        enhancer.setSuperclass(this.target.getClass());  
        // 回调方法  
        enhancer.setCallback(this);  
        // 创建代理对象  
        return enhancer.create();  
    }  
  
    @Override  
    // 回调方法  
    public Object intercept(Object obj, Method method, Object[] args,  
            MethodProxy proxy) throws Throwable {  
        System.out.println("代理开始");  
        Object proxyObj = proxy.invokeSuper(obj, args);  
        System.out.println("代理结束");  
        return proxyObj;  
    }  

}

 4.4 测试效果

 

package com.travelsky.pss.tanjie.cglib.proxy;

public class TestCglib {

	public static void main(String[] args) {
		StudyJavaProxyCglibBridge cglib = new StudyJavaProxyCglibBridge();
		StudyJavaProxyCglibImpl studyJavaProxyCglibImpl = (StudyJavaProxyCglibImpl) cglib
				.getInstance(new StudyJavaProxyCglibImpl());
		studyJavaProxyCglibImpl.beginStudyJavaProxy();
	}
}

/////////////////////////效果/////////////////////////////////////
代理开始
开始学习设计模式
代理结束

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