代理模式
什么是代理模式?
代理模式就是找一個中介幫你辦一些事,你只需要關注自己的事就行了,其他的中介會幫你辦好,
代理模式中有三個要素:
- 抽象物件:介面
- 代理物件:類
- 真實物件:類
靜態代理
靜態代理:有你自己來創建代理物件,每個真實物件都需要由你來創建代理物件,
缺點:如果有很多個真實物件需要被代理,那你需要寫很多的代理類,
靜態代理的主要思路就是:在代理類中放一個被代理類的物件,通過代理類去實作被代理類的方法,而在被代理方法執行之前或之后,你可以進行一些額外的操作,
代碼實作:
interface Eat{
void eat();
}
//真實類
class Person implements Eat{
private String name;
Person(String name){
this.name = name;
}
public String getName(){
return this.name;
}
@Override
public void eat() {
System.out.println(this.name+"吃飯");
}
}
//代理類
class ProxyPerson implements Eat{
private Person person;
ProxyPerson(Person person){
this.person = person;
}
@Override
public void eat() {
System.out.println("幫"+person.getName()+"做飯");
person.eat();
System.out.println("幫"+person.getName()+"洗碗");
}
}
public class StaticProxyTest {
public static void main(String[] args) {
ProxyPerson pp = new ProxyPerson(new Person("小明"));
pp.eat();
}
}
運行結果:

這就是一個靜態代理的例子,
動態代理
在靜態代理中,代理類是固定的,而動態代理就是可以讓代理類動態的生成,這里使用的反射機制,
動態代理通過一個Proxy類和InvocationHandler介面來動態的創建代理類,
代碼實作:
interface Eat{
void eat();
}
//真實類
class Person implements Eat{
private String name;
Person(String name){
this.name = name;
}
public String getName(){
return this.name;
}
@Override
public void eat() {
System.out.println(this.name+"吃飯");
}
}
class MyInvocationHandler implements InvocationHandler{
private Object obj;
MyInvocationHandler(Object obj){
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("做飯");
method.invoke(obj);
System.out.println("洗碗");
return null;
}
}
public class StaticProxyTest {
public static void main(String[] args) {
Eat person = new Person("tom");//真實物件
InvocationHandler handler = new MyInvocationHandler(person);
Eat eat = (Eat) Proxy.newProxyInstance(Person.class.getClassLoader(),Person.class.getInterfaces(),handler);
eat.eat();
}
}
運行結果:

動態代理實作步驟
Proxy.newProxyInstance(Person.class.getClassLoader(),Person.class.getInterfaces(),handler);
這句話主要是用來創建一個代理類的物件,
在newProxyInstance這個方法中,先使用反射創建了一個代理類,代理類實作了Person所實作的介面,在代理類中還有一個帶有InvocationHandler為引數的構造器,在呼叫代理物件的方法時,實際上呼叫的是InvocationHandler中的invoke方法,
總結
今天只是大概的了解一下靜態代理和動態代理,對他們的底層實作還需要慢慢了解,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/188603.html
標籤:Java
上一篇:面向物件(1)
