文章的思路定义多需要感谢《大话设计模式》这本书,提供的案例可以让读者很容易理解。有什么不对的地方希望大家指导。
代理模式:为其他对象提供一种代理以控制对这个对象的访问(租房中介就是代理,webservice就是一个很好的代理案例,Nginx的使用都利用的代理的思想,hibernate中的CGlib也是使用的代理的思想)。
常见的代理有:
- 远程代理(Remote Proxy):对一个位于不同的地址空间对象提供一个局域代表对象,如RMI中的stub
- 虚拟代理(Virtual Proxy):根据需要将一个资源消耗很大或者比较复杂的对象,延迟加 载,在真正需要的时候才创建
- 安全代理(Protect or Access Proxy):控制对一个对象的访问权限。
- 智能引用(Smart Reference Proxy):提供比目标对象额外的服务和功能。
形象举例(代理和装饰模式):
代理模式:在不改变接口的前提下,控制对象的访问
例子:孙悟空扮演并代替高家三小姐
孙悟空扮演高家三小姐,所以可以说孙悟空与高家三小姐具有共同的接口。如果猪八戒只想 见见高家三小姐的娇好面容,或者谈谈天说说地,那么高家三小姐的“代理”孙悟空是允许 的,但猪八戒想亲亲嘴,那么是不行的。这是保护代理模式的应用。只有代理对象认为合适 时,才会将客户端的请求传递给真实主题对象。
装饰模式:在不改变接口的前提下,动态扩展对象的功能
孙悟空有七十二般变化,在二郎神眼里,他永远是那只猢狲。装饰模式以对客户透明的方式 动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有 什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。他的每 一种变化都给他带来一种附加的本领。他变成鱼儿时,就可以到水里游泳;他变成雀儿时, 就可以在天上飞行。而不管悟空怎么变化,在二郎神眼里,他永远是那只猢狲。装饰模式以 对客户透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在 装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能 加以扩展。
代理的实现步骤:
1.创建代理接口;定义实现方法
2.创建被代理类(追求类)实现代理接口,编写为了目的需要实现的方法逻辑(功能)
3.创建代理类,实现代理接口,代理类中创建被代理类对象;通过创建的被代理类对象来调用自身定义好的目标方法;
4.创建 被追求者类(目标类),目标类指定给代理类,通过代理来来实现追求者的目的;这是被追求者只知道代理者,而不知道追求者,
代码:
1.//代理接口
public interface GiveGift {
//定义方法
public void GiveDolls();
public void GiveFloers();
public void GiveChocolate();
}
2.//追求者类
public class Pursuit implements GiveGift {
public SchoolGirl schoolGirl;
public Pursuit(SchoolGirl schoolGirl) {
super();
this.schoolGirl = schoolGirl;
}
@Override
public void GiveDolls() {
System.out.println(schoolGirl.getName()+"送你洋娃娃");
}
@Override
public void GiveFloers() {
System.out.println(schoolGirl.getName()+"送你鲜花");
}
@Override
public void GiveChocolate() {
System.out.println(schoolGirl.getName()+"送你巧克力");
}
}
3.//代理类,代理类和追求类有共同的方法和功能
public class Proxy implements GiveGift {
public Pursuit pursuit;
//代理类实现追求者的方法;来完成追求者的任务
public Proxy(SchoolGirl schoolGirl) {
super();
this.pursuit = new Pursuit(schoolGirl);
}
@Override
public void GiveDolls() {
pursuit.GiveDolls();
}
@Override
public void GiveFloers() {
pursuit.GiveFloers();
}
@Override
public void GiveChocolate() {
pursuit.GiveChocolate();
}
}
4.测试类
public class proxyMain {
public static void main(String[] args) {
//定义要送的对象
SchoolGirl schoolGirl = new SchoolGirl();
schoolGirl.setName("许某");
//创建代理类
//把要送的对象通知给代理类
Proxy proxy = new Proxy(schoolGirl);
//通过代理类来实现追求者的要求;这样李娇娇就只知道代理不知道追求者但是也达到了了目的
proxy.GiveDolls();
proxy.GiveFloers();
proxy.GiveChocolate();
}
}
5.结果:
许某送你洋娃娃
许某送你鲜花
许某送你巧克力