代理模式—静态

148 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

在Java的反射时我们就应该接触过代理模式

代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理 对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的 功能操作,即扩展目标对象的功能。

被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象

代理模式有不同的形式, 主要有三种 静态代理、动态代理 (JDK代理、接口代 理)和 Cglib代理 (可以在内存动态的创建对象,而不需要实现接口, 他是属于 动态代理的范畴) 。

在我们编程的过程中,我们并不想我们直接去调用一些事情,所以我们去用代理方式去调用,今天的时间比较紧迫,也只能写完静态部分,明天再继续把其他的代理模式写完。

静态代理

静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一 起实现相同的接口或者是继承相同父类

我们有一个老师,但是她生病了,我们需要找一个代理的老师,我们使用静态代理的方式实现

  1. 定义一个接口:ITeacherDao

  2. 目标对象TeacherDAO实现接口ITeacherDAO

  3. 使用静态代理方式,就需要在代理对象TeacherDAOProxy中也实现ITeacherDAO

  4. 调用的时候通过调用代理对象的方法来调用目标对象.

  5. 代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来 调用目标对象的方法

  1. 创建TeacherDaoProxy对象

  2. 创建teacherDao对象

  3. 将TeacherDao对象,交给TeacherDaoProxy对象执行方法

对象还是创建接口

//接口
public interface ITeacherDao {
	
	void teach(); // 授课的方法
}

再去写实现接口的实现类

public class TeacherDao implements ITeacherDao {

	@Override
	public void teach() {
		// TODO Auto-generated method stub
		System.out.println(" 老师授课中  。。。。。");
	}

}

再去编写代理类

//代理对象,静态代理
public class TeacherDaoProxy implements ITeacherDao{
	
	private ITeacherDao target; // 目标对象,通过接口来聚合
	
	
	//构造器
	public TeacherDaoProxy(ITeacherDao target) {
		this.target = target;
	}



	@Override
	public void teach() {
		// TODO Auto-generated method stub
		System.out.println("开始代理  完成某些操作。。。。。 ");//方法
		target.teach();
		System.out.println("提交。。。。。");//方法
	}

}

最后是调用类

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建目标对象(被代理对象)
		TeacherDao teacherDao = new TeacherDao();
		
		//创建代理对象, 同时将被代理对象传递给代理对象
		TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);
		
		//通过代理对象,调用到被代理对象的方法
		//即:执行的是代理对象的方法,代理对象再去调用目标对象的方法 
		teacherDaoProxy.teach();
	}

}

优点:在不修改目标对象的功能前提下, 能通过代理对象对目标功能扩展

缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类 一旦接口增加方法,目标对象与代理对象都要维护 。