设计模式——代理模式

代理模式:

核心作用:通过代理控制对对象的访问,可以详细访问某个对象的方法,在调用这个方法前置处理,调用这个方法后做后置处理。

抽象角色:定义角色代理和真实角色的公共对外方法。

真实角色:实现抽象角色,定义真实角色所需要的实现的业务逻辑,供代理角色调用。 关注真正的业务逻辑!

代理角色:实现抽象角色,是真实角色的代理,通过真实角色的代理的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 将统一的流程控制放到代理角色中处理。

安全代理:屏蔽对真实角色的直接访问。

远程代理:通过代理类处理远程方法调用(RMI)

延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象。

分类: 静态代理 动态代理

应用:

JDK自带的动态代理

javaassist字节码操作

CGLIB(Code Generation Library)库的实现

ASM(汇编底层使用指令,可维护性较差)

静态代理的Demo:

 

package com.wxisme.staticproxy;
/**
 * 静态代理
 * @author Administrator
 *
 */
public interface Star {
    void confer();
    
    void signContract();
    
    void sellTicket();
    
    void sing();
    
    void collectMoney();
    
}

class RealStar implements Star {
    @Override
    public void sellTicket() {
        System.out.println("售票");
    }
    @Override
    public void collectMoney() {
        System.out.println("收钱");
    }
    @Override
    public void confer() {
        System.out.println("面谈");
    }
    @Override
    public void signContract() {
        System.out.println("签合同");
    }
    @Override
    public void sing() {
        System.out.println("明星唱歌");
    }
}

class ProxyStar implements Star {

    private Star star;
    public ProxyStar(Star star) {
        this.star = star;
    }
    @Override
    public void sellTicket() {
        System.out.println("售票");
    }
    @Override
    public void collectMoney() {
        System.out.println("收钱");
    }
    @Override
    public void confer() {
        System.out.println("面谈");
    }
    @Override
    public void signContract() {
        System.out.println("签合同");
    }
    //调用真实角色的方法
    @Override
    public void sing() {
        star.sing();
    }
    
}

package com.wxisme.staticproxy;

public class Client {
    public static void main(String[] args) {
        Star realStar = new RealStar();
        Star proxy = new ProxyStar(realStar);
        
        proxy.confer();
        proxy.signContract();
        proxy.sellTicket();
        proxy.sing();
        
        proxy.collectMoney();
    }
}

运行结果:

面谈
签合同
售票
明星唱歌
收钱

把静态代理改成动态代理:

可以参考一下大神对Java动态代理的解释:http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html

                                                           http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

 

package com.wxisme.dynamicproxy;

public interface Star {
    void confer();
    
    void signContract();
    
    void sellTicket();
    
    void sing();
    
    void collectMoney();
    
}

class RealStar implements Star {
    @Override
    public void sellTicket() {
        System.out.println("售票");
    }
    @Override
    public void collectMoney() {
        System.out.println("收钱");
    }
    @Override
    public void confer() {
        System.out.println("面谈");
    }
    @Override
    public void signContract() {
        System.out.println("签合同");
    }
    @Override
    public void sing() {
        System.out.println("明星唱歌");
    }
}

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class StarHandler implements InvocationHandler {
    private Star realStar;
    
    
    public StarHandler(Star realStar) {
        super();
        this.realStar = realStar;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object obj = null;
        
        
        //可以进行一系列的流程控制。
        
        System.out.println("售票");
        System.out.println("面谈");
        System.out.println("签合同");
        
        if(method.getName().equals("sing")) {
            obj = method.invoke(realStar, args);
        }
        System.out.println("收钱");
        
        return obj;
    }

}

package com.wxisme.dynamicproxy;

import java.lang.reflect.Proxy;

public class Client {
    public static void main(String[] args) {
        Star realStar = new RealStar();
        StarHandler handler = new StarHandler(realStar);
        Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), 
                new Class[]{Star.class}, handler);
        
        
        proxy.sing();
        
    }
}

运行结果:

售票
面谈
签合同
明星唱歌
收钱

 

posted @ 2015-06-03 23:08  Pickle  阅读(947)  评论(0编辑  收藏  举报