java23种设计模式之代理模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZhangY1217/article/details/83007073

什么是代理?

  简单的来说就把通过第三方来完成一件事。

代理分为:

1.静态代理     2.动态代理

1.静态代理

 * 1.定义抽象行为的类【抽象类、接口】
 * 2.定义具体的实现类实现抽象方法
 * 3.定义代理类实现相同接口
 * 4.代理类必须具有实现类对应的引用
 * 
 * 缺点:
 * 只能代理一类对象
 * 扩张和维护难

直接上代码

 * 1.定义抽象行为的类【抽象类、接口】

​package com.proxy.staticsproxy;
/**
 * 静态代理:
 * 1.定义抽象行为的类【抽象类、接口】
 * 2.定义具体的实现类实现抽象方法
 * 3.定义代理类实现相同接口
 * 4.代理类必须具有实现类对应的引用
 * 
 * 缺点:
 * 只能代理一类对象
 * 扩张和维护难
 * @author zy
 *
 */
public interface IFunction {
   void click();
   String getName();
}​

 * 2.定义具体的实现类实现抽象方法

package com.proxy.staticsproxy;

public class Button implements IFunction {
	
    private String name;

	public Button(String name) {
       this.name=name;
    }
	@Override
	public void click() {
		System.out.println(this.name+"被点击了");

	}

	@Override
	public String getName() {
		return name;
	}

}

* 3.定义代理类实现相同接口* 4.代理类必须具有实现类对应的引用

package com.proxy.staticsproxy;

public class StaticsProxy implements IFunction {

	private IFunction iFunction;
	private String userName;

	public StaticsProxy(IFunction iFunction,String userName) {
		this.iFunction=iFunction;
		this.userName=userName;
	}
	/*
	 * 对click进行包装,有点像装饰者
	 */
	@Override
	public void click() {
	   if(this.userName.equalsIgnoreCase("管理员")){
		   iFunction.click();
	   }else {
		System.out.println("没有权限点击");
	}

	}
//不需要的则不用管,这也是一个缺点,哪怕不用也要重写
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return null;
	}

}

测试类

package com.proxy.staticsproxy;

public class Test {
		public static void main(String[] args) {
			System.out.println("===========不用代理====================");
			IFunction iFunction=new Button("提交");
			iFunction.click();
			System.out.println("===========用代理====================");
			StaticsProxy staticsProxy=new StaticsProxy(iFunction, "管理员1");
			staticsProxy.click();
		}
}

2.动态代理

  * 动态代理:
 * 可以实现不同接口的代理
 * 
 * 缺点:
 * 代理的类必须实现了接口
 * 
 * spring框架的动态代理已经解决了该问题

1.定义抽象部分的接口

package com.proxy.dynamicproxy;
/**
 * 动态代理:
 * 可以实现不同接口的代理
 * 
 * 缺点:
 * 代理的类必须实现了接口
 * 
 * spring框架的动态代理已经解决了该问题
 * @author zy
 *
 */
public interface IFunction {
     void click();
     String name();
}

 2.定义实现类

package com.proxy.dynamicproxy;
/**
 * 文本框实现类
 * @author zy
 *
 */
public class Text implements IFunction {

	private String name;

	public Text(String name) {
		this.name=name;
	}
	@Override
	public void click() {
		System.out.println(this.name+"被点击了");

	}

	@Override
	public String name() {
		return name;
	}

}

 3.定义动态代理类

package com.proxy.dynamicproxy;

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

public class DynamicProxy {
	//定义object的对象,所以类的父类都是object
	private Object obj;
	private String userName;
   public DynamicProxy() {
     }
   //初始化
	public DynamicProxy(Object obj,String userName) {
		this.obj=obj;
		this.userName=userName;
	}
	//创建动态代理的对象;使用jdk自带的proxy来创建
	public  Object createProxy(){
	return	Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),new HanderProxy());
	}
	
	//定义执行处理内部类
	private class HanderProxy implements InvocationHandler{

		@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			Object invoke=null;
			//判断该引用是否是car类型
			if(!(obj instanceof Car)){
				validateLogin();
				validateRole();
				//这是是获取该方法执行后的返回值
				invoke=method.invoke(obj,args);
				requestDB();
				responseWeb();
			}else {
				 invoke = method.invoke(obj,args);
				 System.out.println(invoke);
			}
			
			return invoke;
		}
	}
   
	private void validateLogin(){
		System.out.println("登陆验证通过");
	}
	private void validateRole(){
		System.out.println(this.userName+"身份验证通过");
	}
	private void requestDB(){
		System.out.println("请求数据库");
	}
	private void responseWeb(){
		System.out.println("响应到页面");
	}
}

4.测试类

package com.proxy.dynamicproxy;

public class Test {
	public static void main(String[] args) {
		IFunction iFunction=new Text("文本框");
		DynamicProxy dynamicProxy=new DynamicProxy(iFunction, "管理员");
		IFunction proxy =(IFunction)dynamicProxy.createProxy();
		proxy.click();
		System.out.println("=============================");
		//另一个接口
		Car car=new Bike();
		car.setName("山地自行车");
		 dynamicProxy=new DynamicProxy(car, "管理员");
		 Car car2 =(Car)dynamicProxy.createProxy();
		 car2.numberOfWheel();
		 car2.getName();
	}
}

还有一个接口我并没有发布出来,第一次学习代理的可以自己试着写一写,毕竟自己写出来的才是自己的 

运行结果: 

登陆验证通过
管理员身份验证通过
文本框被点击了
请求数据库
响应到页面
=============================
自行车有两个轮子
null
山地自行车

猜你喜欢

转载自blog.csdn.net/ZhangY1217/article/details/83007073