手记

JAVA实现静态代理

首先看看什么是代理模式。

一 代理模式

       使用一个代理对象将对象包装起来,然后用该代理对象来取代该对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及何时调用原始对象的方法

二 静态模式

       要求被代理类和代理类同时实现相应的一套接口,通过代理类调用重写接口的方法,实际上调用的是原始对象的同样的方法。如下图:

     Cilent调用Source的method()方法,实际上是Proxy来调用method()方法,静态代理中Source跟Proxy都要实现接口Sourceable。

三 运行环境

首先是父接口 Animal.java 

package com.lxj.proxy;


public interface Animal {
	
	public void action();
	public void breath();
	
}

Cat.java

package com.lxj.proxy;


//被代理类Cat
public class Cat implements Animal{

	@Override
	public void action() {
		System.out.println("喵喵喵~~~~");
	}

	@Override
	public void breath() {
		System.out.println("猫式呼吸法~~~~");
	}
}

CatProxy.java

package com.lxj.proxy;

//代理类
public class CatProxy implements Animal{

	//真正要代理的类
	Cat cat;
	
	public CatProxy(Cat cat){
		this.cat = cat;
	}
	
	@Override
	public void action() {
		System.out.println("==========DogProxy 代理类执行开始!=============");
		//实质上在代理类中是调用了被代理实现接口的方法
		cat.action();
		System.out.println("==========DogProxy 代理类执行结束!===========");
	}

	@Override
	public void breath() {
		System.out.println("==========DogProxy 代理类执行开始!=============");
		cat.breath();
		System.out.println("==========DogProxy 代理类执行结束!===========");
	}

}

TestStaticProxy.java

package com.lxj.proxy;


public class TestStaticProxy {
	
    public static void main(String[] args) {
		 //被代理的类Cat,Cat实现了Animal接口
         Cat cat = new Cat();
         //代理类CatProxy,也实现了Animal接口
		 CatProxy catProxy = new CatProxy(cat);
         //代理类来调用方法,实际上调用的是Cat的action(),breath()方法
		 catProxy.action();
		 catProxy.breath();
	}
}

运行结果如下:

从运行结果可以看到其实执行的是被代理类的对象.

从这里我们会想,如果我想再创建一个Dog对象,又需要重新为Dog创建一个代理对象,如下:

Dog.java

package com.lxj.proxy;

//被代理类 Dog
public class Dog implements Animal {

	@Override
	public void action() {
        System.out.println("汪汪汪~~~~~");
	}

	@Override
	public void breath() {
        System.out.println("狗式呼吸法~~~~");
	}

}

DogProxy.java

package com.lxj.proxy;

//Dog的代理类
public class DogProxy implements Animal {
   
	Dog dog;
	
	public DogProxy(Dog dog) {
		this.dog = dog;
	}

	@Override
	public void action() {
		System.out.println("==========DogProxy 代理类执行开始!=============");
		dog.action();		
		System.out.println("==========DogProxy 代理类执行结束!===========");
	}

	@Override
	public void breath() {
		System.out.println("==========DogProxy 代理类执行开始!=============");
		dog.breath();
		System.out.println("==========DogProxy 代理类执行结束!===========");
	}
	
}

TestStaticProxy.java

package com.lxj.proxy;


public class TestStaticProxy {
	
    public static void main(String[] args) {
		 Cat cat = new Cat();
		 CatProxy catProxy = new CatProxy(cat);
		 catProxy.action();
		 catProxy.breath();
		 
		 Dog dog = new Dog();
		 DogProxy dogProxy = new DogProxy(dog);
		 dogProxy.action();
		 dogProxy.breath();
	}
}

运行结果如下:

每次我要新加入一个实现Animal接口的对象的话,都要重新创建一个代理对象,这样会非常的麻烦,这其实是静态代理的缺点,动态代理请看下一篇博客。







1人推荐
随时随地看视频
慕课网APP