zoukankan      html  css  js  c++  java
  • 设计模式之结构型--代理模式

    代理模式(Proxy pattern)
    核心作用:

    通过代理,控制对对象的访问
    可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后
    做后置处理(即:AOP的微观实现)

    ----AOP(Aspect Oriented Programming面向切面编程)的核心实现机制

    --核心角色:

    抽象角色:
      定义代理角色和真实角色的公共对外方法,(一个接口,真实角色和代理角色都要去实现这个接口)
    真实角色
      实现抽象角色,定义真实角色所要实现的业务逻辑供代理角色调用
    代理角色
      实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现
      抽象方法,并可以附加自己的操作(外部只会去访问代理类,代理再调用真实角色的方法)

    将统一的流程控制放到代理角色中处理

    静态代理容易实现(省略)
    动态代理(JDK自带的实现)
    --java.lang.reflect.Proxy
      作用:动态生成代理类和对象
    --java.lang.reflect.InvocationHander(处理器接口)
      可以通过invoke方法实现对真实角色的代理访问
      每次通过Proxy生成代理类对象时都要指定对应的处理器对象

     动态代理实例:

    package com.luruixiao.pattern.dynamicProxy;
    
    public interface Star {
    	/**
    	  *面谈
    	 */
    	void confer();
    	/**
    	 * 签合同
    	 */
    	void signContract();
    	/**
    	 * 订票
    	 */
    	void bookTicket();
    	/**
    	 * 唱歌
    	 */
    	void sing();
    	/**
    	 * 收钱
    	 */
    	void collectMoney();
    }
    

      

    package com.luruixiao.pattern.dynamicProxy;
    
    public class RealStar implements Star{
    
    	@Override
    	public void confer() {
    		System.out.println("RealStar.confer()");
    	}
    
    	@Override
    	public void signContract() {
    		System.out.println("RealStar.signContract()");
    	}
    
    	@Override
    	public void bookTicket() {
    		System.out.println("RealStar.bookTicket()");
    	}
    
    	@Override
    	public void sing() {
    		System.out.println("本人RealStar.sing()");
    	}
    
    	@Override
    	public void collectMoney() {
    		System.out.println("RealStar.collectMoney()");
    	}
    
    }
    

      

    package com.luruixiao.pattern.dynamicProxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class StarHandler implements InvocationHandler{
    	
    	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("面谈,签合同,预付款,订机票");
    		if(method.getName().equals("sing")) {
    			obj = method.invoke(realStar, args);
    		}
    		System.out.println("真正方法执行后");
    		System.out.println("收尾款");
    		return obj;
    	}
    
    }
    

      

    package com.luruixiao.pattern.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.bookTicket();
    		proxy.sing();
    	}
    }
    

      

  • 相关阅读:
    docker镜像文件导入与导出,支持批量
    配置和启动Kubernetes服务
    在CentOS 7 上安装docker
    安装CentOS7精简版后的配置工作
    Docker镜像加速
    docker命令不需要敲sudo的方法
    建立时间和保持时间(setup time 和 hold time)
    时序收敛:基本概念
    GitHub: Windows 下的简单使用
    K-means算法和矢量量化
  • 原文地址:https://www.cnblogs.com/lrxvx/p/9407344.html
Copyright © 2011-2022 走看看