1:靜態(tài)代理
- 抽象角色:聲明真實(shí)對(duì)象和代理對(duì)象的共同接口,這樣可在任何使用真實(shí)對(duì)象的地方都可以使用代理對(duì)象苦银。
- 代理角色:代理對(duì)象內(nèi)部含有真實(shí)對(duì)象的引用什往,從而可以在任何時(shí)候操作真實(shí)對(duì)象左敌。代理對(duì)象提供一個(gè)與真實(shí)對(duì)象相同的接口始苇,以便可以在任何時(shí)候替代真實(shí)對(duì)象绰沥。代理對(duì)象通常在客戶端調(diào)用傳遞給真實(shí)對(duì)象之前或之后,執(zhí)行某個(gè)操作蔚万,而不是單純地將調(diào)用傳遞給真實(shí)對(duì)象岭妖,同時(shí),代理對(duì)象可以在執(zhí)行真實(shí)對(duì)象操作時(shí)笛坦,附加其他的操作区转,相當(dāng)于對(duì)真實(shí)對(duì)象進(jìn)行封裝。
- 真實(shí)角色:即為代理對(duì)象所代表的目標(biāo)對(duì)象版扩,代理角色所代表的真實(shí)對(duì)象,是我們最終要引用的對(duì)象侄泽。
interface Subject//抽象角色
{
public void doSomething();
}
class RealSubject implements Subject//真實(shí)角色
{
public void doSomething()
{
System.out.println( "call doSomething()" );
}
}
class SubjectProxy implements Subject//代理角色
{
//代理模式的作用是:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)礁芦。
Subject subimpl = new RealSubject();
public void doSomething()
{
System.out.println("before"); //調(diào)用目標(biāo)對(duì)象之前可以做相關(guān)操作
subimpl.doSomething();
System.out.println("after");//調(diào)用目標(biāo)對(duì)象之后可以做相關(guān)操作
}
}
public class Test
{
public static void main(String[] args) throws Exception
{
Subject sub = new SubjectProxy();
sub.doSomething();
}
}
2:動(dòng)態(tài)代理
通過(guò)創(chuàng)建代理類并實(shí)現(xiàn)InvocationHandler
直接上代碼
public interface IShop {
void buy();
}
public class Bestar implements IShop {
@Override
public void buy() {
System.out.println("購(gòu)買腐乳");
}
}
public class DynamicPurchasing implements InvocationHandler {
private Object object;
public Object bind(Object obj){
this.object = obj;
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(object,args);
if (method.getName().equals("buy")){
System.out.println("買買買");
}
return result;
}
}
//使用時(shí)
public void testDynamicPurchasing(){
IShop iShop = (IShop) new DynamicPurchasing().bind(new Bestar());
iShop.buy();
}