设计模式系列之三_代理模式(Proxy)

1.什么事代理模式(Proxy Pattern)

  23种java常用设计模式之一。代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。
在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象
之间起到中介的作用。
类图如下:
设计模式系列之三_代理模式(Proxy)_第1张图片

2.代理模式中涉及到的三个角色

  (1)抽象角色:声明真实对象和代理对象的共同接口。
  (2)真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
  (3)代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象;
同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,
代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。  

3.代理模式优点

(1)职责清晰:真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,
通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2)代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了
目标对象的作用。
(3)高扩展性

4.代码示例

  假设有一个TalkInterface接口,有空的方法talk()(说话),所有的Person对象都实现这个接口,
实现talk()方法,前端有很多地方都将Person实例化,执行talk方法,后来发现这些前端里
有一些除了要说话以外还要唱歌(sing),那么我们既不能在TalkInterface接口里增加sing()方法,
又不能在  每个前端都增加sing方法,我们只有增加一个代理类TalkProxy,这个代理类里实现
talk和sing方法,然后在需要sing方法的客户端调用代理类即可,代码如下:

/**
 * @Title:说话接口
 * @Description:TODO
 * @Company: Orclight's Studio
 * @author: shuzl  2013-3-12 上午10:55:52
 * @motto: Never put off what you can do today until Tomorrow
 * @version 1.0.0 
 */
public interface TalkInterface {
	public void talk(String msg);
}

/**
 * @Title:person类--实现了说话这个接口
 * @Description:TODO
 * @Company: Orclight's Studio
 * @author: shuzl  2013-3-12 上午10:57:16
 * @motto: Never put off what you can do today until Tomorrow
 * @version 1.0.0 
 */
public class Person implements TalkInterface{
	private String username;
	
	public Person() {
		
	}
	public Person(String username) {
		this.username = username;
	}

	@Override
	public void talk(String msg) {
		System.out.println("我是"+username+","+msg);
	}
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
}


/**
 * @Title:Person业务代理类,在处理
 * @Description:TODO
 * @Company: Orclight's Studio
 * @author: shuzl  2013-3-12 上午11:01:34
 * @motto: Never put off what you can do today until Tomorrow
 * @version 1.0.0 
 */
public class PresonProxy implements TalkInterface{
	private Person person;
	
	@Override
	public void talk(String msg) {
		//处理业务逻辑前,先做点其他的
		singing("glory glory hallelujah");
		person.talk(msg);
	}

	public void singing(String songMsg) {
		System.out.println("唱歌:"+songMsg);
	}
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
} 

/**
 * @Title:代理模式测试类
 * @Description:TODO
 * @Company: Orclight's Studio
 * @author: shuzl  2013-3-12 上午11:04:18
 * @motto: Never put off what you can do today until Tomorrow
 * @version 1.0.0 
 */
public class TestProxy {
	public static void main(String[] args) {
		Person person = new Person("orclight");
		person.talk("Hello!");
		System.out.println("-------------------------------");
		
		PresonProxy proxy = new PresonProxy();
		proxy.setPerson(person);
		proxy.talk("Hello!");
	}
}


参考文章:
1. Java代理模式  
2. Java代理模式_百度百科  
2. 大话设计模式(七)代理模式和java动态代理机制

你可能感兴趣的:(java,设计模式,代理模式)