亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

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開發工程師
手記
粉絲
7794
獲贊與收藏
665

關注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消