package com.the151suggestions.part7;
/**
* Created by wanggs on 2017/7/24.
* 動(dòng)態(tài)代理可以使代理模式更加靈活
*/
public class S06 {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request();
}
}
// 抽象主題角色
interface Subject {
public abstract void request();
}
// 具體主題角色
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject.request");
}
}
// 代理主題角色
class Proxy implements Subject {
// 要代理的實(shí)體類
private RealSubject realSubject;
// 默認(rèn)被代理者
public Proxy() {
realSubject = new RealSubject();
}
// 實(shí)現(xiàn)接口定義的方法
@Override
public void request() {
before();
// 代理對(duì)象的方法執(zhí)行
realSubject.request();
after();
}
private void after() {
System.out.println("Proxy.after");
}
private void before() {
System.out.println("Proxy.before");
}
}
動(dòng)態(tài)代理
package com.the151suggestions.part7;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* Created by wanggs on 2017/7/24.
* 動(dòng)態(tài)代理可以使代理模式更加靈活
*/
public class S06 {
public static void main(String[] args) {
// 動(dòng)態(tài)代理
/* Proxy proxy = new Proxy();
proxy.request();*/
// 具體主題角色, 也就是被代理類
Subject subject = new RealSubject();
// 代理實(shí)例的處理Handler
InvocationHandler invocationHandler = new SubjectHandler(subject);
// 當(dāng)前加載器
ClassLoader classLoader = subject.getClass().getClassLoader();
// 動(dòng)態(tài)代理
Subject proxy = (Subject) Proxy.newProxyInstance(classLoader,subject.getClass().getInterfaces(),invocationHandler);
proxy.request();
}
}
// 抽象主題角色
interface Subject {
public abstract void request();
}
// 具體主題角色
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject.request");
}
}
/*
// 代理主題角色
class Proxy implements Subject {
// 要代理的實(shí)體類
private RealSubject realSubject;
// 默認(rèn)被代理者
public Proxy() {
realSubject = new RealSubject();
}
// 實(shí)現(xiàn)接口定義的方法
@Override
public void request() {
before();
// 代理對(duì)象的方法執(zhí)行
realSubject.request();
after();
}
private void after() {
System.out.println("Proxy.after");
}
private void before() {
System.out.println("Proxy.before");
}
}*/
class SubjectHandler implements InvocationHandler{
// 被代理對(duì)象
private Subject subject;
public SubjectHandler(Subject subject){
this.subject = subject;
}
// 委托處理方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 預(yù)處理
System.out.println("預(yù)處理");
Object object = method.invoke(subject,args);
// 后處理
System.out.println("后處理");
return object;
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者