继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

JAVA实现静态代理

刘信坚
关注TA
已关注
手记 52
粉丝 7795
获赞 665

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

一 代理模式

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

二 静态模式

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

https://img2.mukewang.com/5b5b38cd0001b46a06140248.jpg

     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();
	}
}

运行结果如下:

https://img.mukewang.com/5b5b3b380001c16011360749.jpg

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

从这里我们会想,如果我想再创建一个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();
	}
}

运行结果如下:

https://img4.mukewang.com/5b5b3bc400017a4e09590792.jpg

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







打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP