代理模式简单点就和现实中一样,只是代理实质性的还是别人在做。比如一个工厂招工,另外还有个人力资源部也在为该工厂招工,对外都是招工,表面不同,其实都是给这家工厂招人。
代理模式分为3部分:
1.代理抽象类(大多以一个接口出现,抽象表示代理提供的目标条件、用处)
2.代理类(提供代理目标给客户)
3.代理目标(实现代理抽象类的功能,被代理类使用)
举例如下:
情景:有家打字服务公司,当然干活的都是打字员,都能打字,打字员分两种:男和女打字员。由于公司觉得女同志打字比较辛苦,所以就让女同志只接活,最终交给男打字员操作,默认接来的活都交给Join,也可指定某个男打字员来操作,在客户看来是女打字员打字,其实是别人在干,她们只告诉别人我能给你们提供打字服务。这样女打字员就成了一个代理。
代码:
Typist
package j2se.proxy;
/**
* 打字员
* @author Lyon Yao
*
*/
public interface Typist {
/**
* 打字
*/
public void type();
}
ManTypist
package j2se.proxy;
/**
* 男打字员
* @author Lyon Yao
*
*/
public class ManTypist implements Typist {
private String name;
public ManTypist(String name) {
this.name = name;
}
@Override
public void type() {
// TODO Auto-generated method stub
System.out.println("I'm "+this.name+" and I'm typing");
}
}
WomanTypist
package j2se.proxy;
/**
* 女打字员
* @author Lyon Yao
*
*/
public class WomanTypist implements Typist {
private Typist typist=null;
public WomanTypist(Typist typist) {
super();
this.typist = typist;
}
public WomanTypist() {
super();
this.typist=new ManTypist("Join");//default Join to do this work
// TODO Auto-generated constructor stub
}
@Override
public void type() {
// TODO Auto-generated method stub
typist.type();
}
}
测试
package j2se.proxy;
import org.junit.Test;
public class TestCase {
@Test
public void proxyTest(){
WomanTypist typist=new WomanTypist();
typist.type();
Typist manTypist=new ManTypist("Tom");
typist=new WomanTypist(manTypist);
typist.type();
}
}