代理对于我们来说再熟悉不过了,比如:代理商,代理律师。那么代理的到底是什么含义呢?代理就是受委托代表当事人进行某种活动。那么代理模式的核心作用是什么呢?就是通过代理,控制对象的访问。可以详细的控制访问某个或者是某类对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。
代理是在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用代理模式。
下面是一些可以使用代理 模式常见情况:
1.远程代理为一个对象在不同的地址空间提供局部代表。
2.虚代理根据需要创建开销很大的对象,使得此对象只在需要时才会真正创建。
3.保护代理控制对原始对象的访问。
4.智能指引取代了简单的指针,它在访问对象时执行一些附加操作。
5.防火墙代理,保护目标,不让恶意用户接近。
代理又分为静态代理(静态定义代理类)和动态代理(动态生成代理类)两种。
动态代理相比较静态代理而言在抽象角色中(接口)声明的所有方法都被转移到调用处理器一个集中的方法中处理,这样的好处就是我们可以更加灵活和统一的处理众多的方法。
举个例子:假如说我在北京工作,接了一个上海的项目,但是由于太远我又不想去上海,怎么办呢?此时刚好我一个同学在上海上班,于是我就跟我的同学联系,让他帮我把这个项目谈过来。接项目肯定需要 面谈—>起草合同—>收首款—>做项目—>收尾款。除了完成项目的过程是由我本人执行之外,其他的都是由我同学来处理的,那么我同学所起的作用就是代理。
静态代理模式为
接项目过程
public interface Project {
String interview();
String drafContract();
String receiveFirst();
String doProjects ();
String endParagraph();
}
本人自己
public class Mine implements Project {
@Override
public String interview() {
return "Mine--->interview";
}
@Override
public String drafContract() {
return "Mine--->drafContract";
}
@Override
public String receiveFirst() {
return "Mine--->receiveFirst";
}
@Override
public String doProjects() {
return "Mine--->doProjects";
}
@Override
public String endParagraph() {
return "Mine--->endParagraph";
}
}
同学代理
public class ProxySchoolmate implements Project{
private Project mine;
public ProxySchoolmate(Mine mine) {
this.mine = mine;
}
@Override
public String interview() {
return "ProxySchoolmate--->interview";
}
@Override
public String drafContract() {
return "ProxySchoolmate--->drafContract";
}
@Override
public String receiveFirst() {
return "ProxySchoolmate--->receiveFirst";
}
@Override
public String doProjects() {
return mine.doProjects();
}
@Override
public String endParagraph() {
return "ProxySchoolmate--->endParagraph";
}
}
测试
Mine mine = new Mine();
ProxySchoolmate proxySchoolmate = new ProxySchoolmate(mine);
System.out.println(proxySchoolmate.interview());
System.out.println(proxySchoolmate.drafContract());
System.out.println(proxySchoolmate.receiveFirst());
System.out.println(proxySchoolmate.doProjects());
System.out.println(proxySchoolmate.interview());
System.out.println(proxySchoolmate.endParagraph());
运行效果
作者:u014452224 发表于2017/2/21 18:48:15 原文链接
阅读:110 评论:0 查看评论