代理模式(自用)

代理设计模式:为其他对象提供一种代理,以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制目标对象的访问,并且可以在不改变目标对象的情况下,添加一些额外的功能。还隐藏被代理类的细节。

静态代理

UML类图:
在这里插入图片描述

被代理的类

/**
 * 目标类,潘**
 */
public class PJL implements Methods {
    /**
     * 被代理的方法
     */
    @Override
    public void he() {
        System.out.println("羞羞羞");
    }
    public void eat(){
        System.out.println("吃饭饭");
    }
}

代理接口:

/**
 * 代理接口
 */
public interface Methods {
    /**
     * 羞羞的方法
     */
    public void he();
}

代理类:

/**
 * 代理者,王*
 */
public class WP implements Methods {
    private Methods methods ;
    @Override
    public void he() {
        methods = new PJL();
        System.out.println("给点小费呗");
        methods.he();
    }
}

测试类:

/**
 * 测试类,西门*
 */
public class XMQ {
    public static void main(String[] args) {
        WP wp = new WP();
        wp.he();
    }
}
动态代理

动态代理类在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和被代理类的关系是在程序运行时确定。

被代理的类:

package moving;
/**
 * 目标类
 * @author asus
 */
public class lucida implements lucidaMethod{
	@Override
	public String show(String name) {
		System.out.println("跳了一支《"+name+"》舞");
		return "跳完了";
	}
	@Override
	public String sing(String name) {
		System.out.println("唱了一首《"+name+"》");
		return "唱完啦";
	}
   /**
     *此方法不需要被代理,不需要抽成接口
     */
	public void eat(){
		System.out.println("吃饭");
	}
}

代理接口中需要被代理的方法的接口:

package moving;
/**
 * 需要被代理的方法
 * @author asus
 *
 */
public interface lucidaMethod {
	/**
	 * 跳舞
	 * @param name 舞蹈名字
	 * @return  是否表演
	 */
	public String show(String name);
	/**
	 * 唱歌
	 * @param name 歌曲名字
	 * @return 是否唱歌
	 */
	public String sing(String name);
}

代理类:

package moving;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * 代理类
 * @author asus
 *
 */
public class ProxyClass {
	/**创建被代理的对象,*/
	private static final lucida lu = new lucida();
	/**
	 * 访问代理类的方法
	 * @return  被代理的方法
	 */
	public static lucidaMethod getPoxyInstance(){
	                                  	//使用proxy中的方法获取代理类对象
		lucidaMethod obj = (lucidaMethod)Proxy.newProxyInstance(
				//第一个参数,定义代理类的类加载器
				ProxyClass.class.getClassLoader(),
				//第二个参数,代理类要实现的接口列表
				lu.getClass().getInterfaces(), 
				/*
				 *第三个参数
				 * 拦截外界调用代理对象中的任何方法,
				 * 当外界调用代理对象的的方法后,InvocationHandler类中的invoke方法自动执行
				 */			
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						//对show方法进行增强
						if("show".equals(method.getName())){
							System.out.println("先给钱,跳舞");
						    return method.invoke(lu, args);
						        //对sing方法进行增强
						}else if("sing".equals(method.getName())){
							System.out.println("先给钱,然后才可以唱歌");
						    return method.invoke(lu, args);
						}else{
							System.out.println("暂时没有代理此业务");
						}	
						return null;
					}
				});		
		return obj;
	}
}

结语:未完待续吧,等领悟的更加透彻后,再做修改。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值