概括
名称 | Proxy |
结构 | |
动机 | 为其他对象提供一种代理以控制对这个对象的访问。 |
适用性 |
|
解析
形象比喻:
跟MM在网上聊天, 一开头总是,“hi, 你好”,“你从哪儿来呀?”,“你多大了?”,“身高多少呀?” 这些话,真烦人, 写个程序做为我的Proxy 吧, 凡事接收到这些话都设置好自动的回答,接收到其他的话时再通知我回答,怎么样。
代理模式中的“代理商”要想实现代理任务, 就必须和被代理的“厂商”使用共同的接口。于是代理模式就有三个角色组成了:
1) 抽象主题角色: 声明了真实主题和代理主题的共同接口
2) 代理主题角色: 内部包含了对真实主题的应用, 并且提供和真实主题角色相同的接口
3) 真实主题对象: 定义真实的对象
代理模式能够协调调用者和被调用者, 能够在一定程度上降低系统的耦合度。代理模式中真实主题角色可以结合组合模式来构造,这要一个代理主题角色就可以对一系列这是主题角色有效,提高代码的利用率,较少不必要子类的产生。
实例
涉及的文件:
抽象角色 Subject.java
真实角色 -RealSubject.java
代理角色 - ProxySubject.java
测试类: TestMain.java
/**
* @author oscar999
* @date 2014-4-28
* @version V1.0
*/
package designptn.proxy;
public abstract class Subject {
abstract public void request();
}
/**
* @author oscar999
* @date 2014-4-28
* @version V1.0
*/
package designptn.proxy;
public class RealSubject extends Subject {
public RealSubject(){
}
@Override
public void request() {
System.out.println("From real subject.");
}
}
/**
* @author oscar999
* @date 2014-4-28
* @version V1.0
*/
package designptn.proxy;
public class ProxySubject extends Subject {
private RealSubject realSubject;
public ProxySubject() {
}
@Override
public void request() {
// preRequest();
if (realSubject == null) {
realSubject = new RealSubject();
}
realSubject.request();
// postRequest();
}
}
/**
* @author oscar999
* @date 2014-4-28
* @version V1.0
*/
package designptn.proxy;
public class TestMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Subject sub = new ProxySubject();
sub.request();
}
}