12 代理模式

核心作用:通过代理,控制对对象的访问。

代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

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

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

    代理对象UML图

从图中,我们可以看到:

1、抽象角色

定义代理角色和真实角色对外的方法

2、真实角色

实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用

3、代理角色

 实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

 

分类:

静态代理:静态定义代理类

动态代理:程序运行时运用反射机制动态创建而成。

/**
 * 抽象角色
 * 
 * @author sun
 *
 */
public interface Star {
    /**
     * 面谈
     */
    void confer();

    /**
     * 签合同
     */
    void signContract();

    /**
     * 订机票
     */
    void bookTicket();

    /**
     * 唱歌
     */
    void sing();

    /**
     * 收钱
     */
    void collectMoney();

}

 

/**
 * 真实角色
 * 
 * @author sun
 *
 */
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");
    }

}

 

/**
 * 代理类
 * 
 * @author sun
 *
 */
public class ProxyStar implements Star {
	private Star star;

	public ProxyStar(Star star) {
		super();
		this.star = 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() {
		System.out.println("ProxyStar sing");

	}

	@Override
	public void collectMoney() {
		star.sing();
	}

}

  

/**
 * 客户端测试
 * 
 * @author sun
 *
 */
public class Client {
	public static void main(String[] args) {
		Star real = new RealStar();
		ProxyStar proxyStar = new ProxyStar(real);
		proxyStar.bookTicket();
		proxyStar.confer();
		proxyStar.collectMoney();
		proxyStar.sing();
		proxyStar.signContract();
	}
}

  

posted @ 2017-06-07 11:53  李白说故事  阅读(251)  评论(0编辑  收藏  举报