23模式之: 动态代理模式(jdk版本)demo

明星类型:

package dynamic_proxy_mode;

/**
 * 明星类型
 */
public interface Star {
    
    /**
     * #面谈
     */
//    void confer();
    
    /**
     * #签合同
     */
//    void signContract();
    
    /**
     * #订票
     */
//    void bookTicket();
    
    /**
     * 唱歌
     */
    void sing();
    
    /**
     * #收款
     */
//    void collectMoney();
    
}

 

具体明星:

package dynamic_proxy_mode;

/**
 * 具体明星, 某某明星, 明星实现类, 真实明星
 */
public class RealStar implements Star {

    
    /**
     * #面谈
     */
//    @Override
//    public void confer() {
//        System.out.println("真实角色面谈!");
//    }
    
    
    /**
     * #签合同
     */
//    @Override
//    public void signContract() {
//        System.out.println("真实角色签合同!");
//    }
    
    
    /**
     * #订票
     */
//    @Override
//    public void bookTicket() {
//        System.out.println("真实角色订票!");
//    }
    
    
    /**
     * 唱歌
     */
    @Override
    public void sing() {
        System.out.println("真实角色(周杰伦本人)唱歌!");
    }
    
    
    /**
     * #收款
     */
//    @Override
//    public void collectMoney() {
//        System.out.println("真实角色收款!");
//    }

}

 

类型对象处理类:

package dynamic_proxy_mode;

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

/**
 * 类型对象, 接口对象处理类
 */
public class StarHandler implements InvocationHandler{

    
    /**
     * 持有真实对象的引用
     */
    private Star realStar;
    
    
    /**
     * 构造器(传入真实对象)
     */
    public StarHandler(Star realStar) {
        this.realStar = realStar;
    }


    /**
     * 代理类的所有方法, 都来这报道
     * 核心方法, 所有流程控制都在这里处理, 需要用到其它方法请在这里提供
     * 参数: proxy代理对象, method正在调用的方法, args方法的参数
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object object = null;
        
        System.out.println("真正的方法唱歌执行前!");
        System.out.println("经纪人: 面谈, 签合同, 订票!");//以打印模拟业务处理
        
        //核心方法之外的, 此处可以做到统一的流程控制, 比静态代理更简单了
        if (method.getName().equals("sing")) {
            object = method.invoke(realStar, args);//激活并调用真实对象的方法 
            //void sing(); object是返回值此处为null, 客户端参数也不用传, 但此处args也要写上
        }
        
        System.out.println("真正的方法唱歌执行后!");
        System.out.println("经纪人: 收款!");
        
        return object;
    }

}

 

测试类:

package dynamic_proxy_mode;

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();
    }
}

 

执行结果:

真正的方法唱歌执行前!
经纪人: 面谈, 签合同, 订票!
真实角色(周杰伦本人)唱歌!
真正的方法唱歌执行后!
经纪人: 收款!

 

 

谢谢声明出处!

转自: http://www.cnblogs.com/gscq073240/articles/7118394.html

 

转载于:https://www.cnblogs.com/gscq073240/articles/7118394.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值