转发请注明出处:http://blog.csdn.net/qq_28055429/article/details/51621997
一,代理模式的基础知识
简写:Proxy
解释:为其他对象提供一种代理以控制对这个对象的访问
基本情况:在某些情况下,一些客户不能或者不想直接引用某个对象,就可以利用代理(中介)来实现
二,组成部分:一般由3部分组成
(1)抽象角色:通过接口或抽象声明真实角色实现的业务方法。
(2)代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
(3)真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
如·下图所示:
抽象角色====Subject
代理角色====Proxy
真实角色====RealSubject
三,优点:
(1).职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
(3).高扩展性
四,例子:
例子1:男孩代理追女孩例子:
女孩类:SchoolGirl
public class SchoolGril {
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name ;
}
}
抽象角色:GiveGift
/**
* 接口,给追求者和代理者实现,定义需要调用的方法
* @author maiyu
*
*/
interface GiveGift {
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
真实角色Pursuit.class
/**
* 追求者,实现GiveGift接口,重新其方法
* @author maiyu
*
*/
public class Pursuit implements GiveGift {
SchoolGril girl ;
public Pursuit(SchoolGril girl){ //用于设置想要追求的对象
this.girl = girl;
}
public void GiveDolls() {
System.out.println(girl.getName() + " , 送你大抱熊");
}
public void GiveFlowers() {
System.out.println(girl.getName() + " , 送你玫瑰花");
}
public void GiveChocolate() {
System.out.println(girl.getName() + " , 送你巧克力");
}
}
代理角色:Proxy.class
/**
* 代理者,实现GiveGift接口,重写其方法
* @author maiyu
*
*/
public class Proxy implements GiveGift {
Pursuit boy;
public Proxy(SchoolGril girl) { //设置男孩要追求对象名字
boy = new Pursuit(girl);
}
/**
* 分别调用男孩要送的礼物和表达的内容
*/
public void GiveDolls() {
boy.GiveDolls();
}
public void GiveFlowers() {
boy.GiveFlowers();
}
public void GiveChocolate() {
boy.GiveChocolate();
}
}
测试类:
public class Test {
public static void main(String[] args){
SchoolGril girl1 = new SchoolGril(); //创建女孩对象
girl1.setName("小薇"); //命名小薇
Proxy daili = new Proxy(girl1); //生成男孩要追求的对象
daili.GiveDolls(); //内容
daili.GiveFlowers();
daili.GiveChocolate();
}
}
输出结果:
小薇 , 送你大抱熊
小薇 , 送你玫瑰花
小薇 , 送你巧克力
抽象角色:Italk
/**
* 定义一个接口,以供实现
* @author maiyu
*
*/
public interface Italk {
public void talk(String msg);
}
真实角色:people
/**
* 真实角色,实现Italk接口
* @author maiyu
*
*/
public class People implements Italk {
public String username; //名字
public String age; //年龄
//两个get方法和set方法
public String getName() {
return username;
}
public void setName(String name) {
this.username = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
//初始化名字和年龄的方法
public People(String name1, String age1) {
this.username = name1;
this.age = age1;
}
//重写talk方法
public void talk(String msg) {
System.out.println(msg + "!你好,我是" + username + ",我年龄是" + age);
}
}
代理角色:
/**
* 代理角色:实现Italk接口
* @author maiyu
*
*/
public class TalkProxy implements Italk {
private Italk talker; //接口
public TalkProxy(Italk talker) {
this.talker = talker;
}
//重写talk方法
public void talk(String msg) {
talker.talk(msg);
}
public void talk(String msg, String singname) {
talker.talk(msg);
sing(singname);
}
//增加sing方法
private void sing(String singname) {
System.out.println("唱歌:" + singname);
}
}
测试:
public class Test {
/**
* 测试
* @param args
*/
public static void main(String[] args) {
// 不需要执行额外方法的
People person = new People("小李飞刀", "40");
person.talk("没有代理");
System.out.println("-----------------------------");
// 需要执行额外方法的
TalkProxy talker = new TalkProxy(person);
talker.talk("有代理:", "行百里者半九十");
}
}
输出结果:
没有代理!你好,我是小李飞刀,我年龄是40
-----------------------------
有代理:!你好,我是小李飞刀,我年龄是40
唱歌:行百里者半九十
五,代理模式的种类:
(1)远程代理:就是为一个对象在不同地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实,
如访问外网
(2)虚拟代理:根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,如网页图片的缓存
(3)安全代理:用来控制真实对象访问时的权限。
(4)智能指引:指当调用真实的对象时,代理处理另外一些事。
........... 等等,