proxy pattern ,以公司的小邮局为例说明,假设小邮局可以代理圆通、顺风、EMS等快递公司的接收和发送快件业务,
快递公司的送件员将快递件送到小邮局,小邮局代收件人签收;员工发送快递,将包裹送到小邮局,然后小邮局代员工
指定的快递公司签收快件。员工和各个快递公司之间是通过小邮局进行接收和发送快件。这样会很方便,快递员和员工之间
不用相互等待,即阻塞。
快递公司和小邮局可以抽象为一个接口类:post
package com.netboy.poxy.demo;
/**
* @功能: 邮局和快递的接口
* @版本号:
* @作者: netboy Email:wang_lin_n@163.com
* @时间: 2013-4-5 下午10:34:53
* @例子:
*/
public interface Post {
public void get();
public void send();
}
顺风快递:
package com.netboy.poxy.demo;
/**
* @功能:
* @版本号: 顺丰快递
* @作者: netboy Email:wang_lin_n@163.com
* @时间: 2013-4-5 下午10:37:28
* @例子:
*/
public class ShunFeng implements Post {
@Override
public void get() {
System.out.println("顺风快递,接收快件");
}
@Override
public void send() {
System.out.println("顺风快递,发送快件");
}
}
圆通快递:
package com.netboy.poxy.demo;
/**
* @功能:
* @版本号:
* @作者: netboy Email:wang_lin_n@163.com
* @时间: 2013-4-5 下午10:40:00
* @例子:
*/
public class YuanTong implements Post {
@Override
public void get() {
System.out.println("圆通快递,接收快件");
}
@Override
public void send() {
System.out.println("圆通快递,发送快件");
}
}
代理类:小邮局,和快递公司一样,实现同一个接口
package com.netboy.poxy.demo;
import java.util.ArrayList;
import java.util.List;
/**
* @功能: 小邮局是所有快递公司的代理,用来在我等平民和快递公司之间进行接收和发送快件
* @版本号:
* @作者: netboy Email:wang_lin_n@163.com
* @时间: 2013-4-5 下午10:41:36
* @例子:
*/
public class XiaoYouJu implements Post {
private List<Post> postList = new ArrayList<Post>();
/**
* 为各个快递公司代理接收快件
*/
@Override
public void get() {
if(postList.size() <= 0) {
System.out.println("sorry,现在还没有任何快递公司的快件。。");
return;
}
for(Post post : postList) {
post.get();
}
}
/**
* 为各个快递公司代理发送快件
*/
@Override
public void send() {
if( postList.size() <= 0 ) {
System.out.println("sorry,现在还没有任何快件可以发送");
return;
}
for(Post post : postList) {
post.send();
}
}
/**
* 添加可以代理的快递
*/
public void addPost(Post post) {
this.postList.add(post);
}
/**
* 清空所有代理的快递
*/
public void clearPost() {
postList.clear();
System.out.println("已经清空所有的快递");
}
}
OK,公司人员扩大了很多,每天有很多快递件,所以公司创建 了一个小邮局;
package com.netboy.poxy.demo;
/**
* @功能: 公司一般都会有自己的小邮局,这里公司创建一个小邮局
* @版本号:
* @作者: netboy Email:wang_lin_n@163.com
* @时间: 2013-4-5 下午10:54:37
* @例子:
*/
public class Company {
public static void main(String[] args) {
System.out.println("hello,this is poxy pattern example");
//创建顺风和圆通快递
Post shunfeng = new ShunFeng();
Post yuantong = new YuanTong();
XiaoYouJu xiaoYouJu = new XiaoYouJu();
xiaoYouJu.addPost(shunfeng);
xiaoYouJu.addPost(yuantong);
//小邮局开始接收员工们和快递公司的快件
xiaoYouJu.get();
//小邮局开始发送员工们和快递公司的快件
xiaoYouJu.send();
//小邮局清仓,不接业务
xiaoYouJu.clearPost();
}
}
是不是和策略模式有点像,再仔细想想,确实有点,但,水杯和水,小邮局和快递公司,又有点不一样。
代理模式:代理类与被代理类实现的是同一个接口,因此代理类与被代理类的结构是相同的,代理类知道被代理类的信息;
策略模式:策略容器并不知道内部策略的详细信息,因为容器并没有实现与内部策略相同的接口,即容器与内部策略只是简单的组合关系,容器只是将内部策略的行为抽取出来,进行了统一的实现。
根据需要选择合适的模式。