代理模式(Proxy)一 静态代理

代理模式的作用

  通过代理,控制某个对象的访问,可以详细的控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理,即AOP的微观实现。代理模式也是AOP编程的核心实现机制。

代理模式的应用场景

  抽象角色:定义代理角色和真实角色的公共对外方法; 
  真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。 
  代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。将统一的流程控制放到代理角色中处理。

代理模式的分类

  静态代理; 
  动态代理:包括jdk自带的代理类;javaassist字节码操作库实现;sping的cglib代理;ASM;

 

用代码来理解一下静态代理: 

  1.首先,创建一个明星的接口:

package com.note.pattern.proxy.staticproxy;

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

  2.创建真实明星对象,实现Star的接口,并实现其方法即可:

package com.note.pattern.proxy.staticproxy;

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

}

  3.创建代理明星对象,在该对象中,通过接口注入真实对象,并且对于需要代理的方法调用真实对象的方法,比如sing方法:

package com.note.pattern.proxy.staticproxy;

public class ProxyStar implements Star{
	
	private Star mStar;
	
	public ProxyStar(Star star) {
		mStar = star;
	}
	

	@Override
	public void confer() {
		System.out.println("ProxyStar.confer()");
	}

	@Override
	public void signContract() {
		System.out.println("ProxyStar.signContract()");
	}

	@Override
	public void bookTicket() {
		System.out.println("ProxyStar.bookTicket()");
	}

	@Override
	public void sing() {
		mStar.sing();
	}

	@Override
	public void collectMoney() {
		System.out.println("ProxyStar.collectMoney()");
	}

}

  4.客户端测试:

package com.note.pattern.proxy.staticproxy;

public class Client {

	public static void main(String[] args) {
		
		Star real = new RealStar();
	        Star proxy = new ProxyStar(real);
	    
	        proxy.confer();
                proxy.signContract();
                proxy.bookTicket();
                proxy.sing();

                proxy.collectMoney();
		
	}

}

  运行结果

ProxyStar.confer()
ProxyStar.signContract()
ProxyStar.bookTicket()
RealStar(周杰伦本人).sing()
ProxyStar.collectMoney()

  在上面的例子中可以发现,sing方法由明星本人完成,其他都是代理对象完成。

posted @ 2018-01-03 16:09  jianhuazhao  阅读(363)  评论(0编辑  收藏  举报