核心模块:抽象角色,真实角色,代理角色
所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git
使用场景:适合不方便直接访问对象的情况;
优点:协调了调用者和被调用者,减少耦合,起到了保护目标对象的作用;
缺点:由于使用代理可能会使请求速度变慢;
注意:
1,与中介者模式区别,中介者对中介双方权重均衡,而代理者模式权重偏重于被代理者(真实角色),几乎不关心另一方;
2,代理角色是知道被代理角色(真实角色)的,而中介者是知道双方的;
3,有两种方式一种是我们调用代理来处理真实角色例如保护代理(ActivityManager通过调用ActivityManagerProxy调用ActivityManagerNative),另一种是我们是真实角色我们和代理实现相同接口,我们让代理给我们做相同的事情;
4,代理模式分为:远程代理,保护代理,虚拟代理,缓冲代理;
/**
* Created by tory on 2018/1/4.
* 代理模式
*/
public class ProxyPattern {
public static void main(String[] args) {
PersonMe me = new PersonMe("tory");
ProxyLawyer lawyer = new ProxyLawyer("jhon", me);
lawyer.collect();
lawyer.above();
}
}
//Subject 抽象角色
interface AbsSubject {
//上述
void above();
//收集资料
void collect();
}
//RealSubject 真实角色
class PersonMe implements AbsSubject {
//需要法律援助的人
String name;
PersonMe(String name) {
this.name = name;
}
@Override
public void above() {
System.out.println(name + ":XXX打了我");
}
@Override
public void collect() {
System.out.println(name + " 开始收集资料...");
}
}
//Proxy 代理角色
class ProxyLawyer implements AbsSubject {
//这里是代理律师,
//代理律师是知道被代理人的,不同于中介者模式,中介者模式是知道中介的双方的
String name;
PersonMe person;
ProxyLawyer(String name, PersonMe person) {
this.name = name;
this.person = person;
}
@Override
public void above() {
person.above();
System.out.println("我" + name + "代表我的被害人" + person.name + "向法院提起诉讼...");
}
@Override
public void collect() {
person.collect();
System.out.println(name + " 开始收集资料...");
reading();
}
private void reading() {
System.out.println(name + " 阅读相关法律...");
}
}
内容打印
Hello World!
tory 开始收集资料...
jhon 开始收集资料...
jhon 阅读相关法律...
tory:XXX打了我
我jhon代表我的被害人tory向法院提起诉讼...