为了账号安全,请及时绑定邮箱和手机立即绑定

JAVA实现静态代理

标签:
Java 面试 架构

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

一 代理模式

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

二 静态模式

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

https://img1.sycdn.imooc.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://img1.sycdn.imooc.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://img1.sycdn.imooc.com//5b5b3bc400017a4e09590792.jpg

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







点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
7796
获赞与收藏
665

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消