定义:
给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
使用场景:
- 当业务无法直接访问某个类时,需要一个代理类去代理访问。
- 当需要横向添加一些功能,比如日志功能时,可以使用代理模式。
优点:
- 可以使真实业务角色责任更纯粹,不用包含一些公共业务。
- 公共业务交给了代理类,实现了解耦。
- 提供了面向切面编程的基础,使一个横向业务更容易编写
- 动态代理可以代理多个实现了同一个接口的类。
缺点:
增加代理类可能会导致业务处理速度变慢,使代码结构更复杂。
代码实例:
网络已经是现在人离不开的东西了,我们每天都要上网浏览信息。上网的方式也很简单。但是,当我们要访问一些国外的网站时,就发现访问不了了。这时候就出现了一些VPN,他可以帮助我们去访问一些国内不能访问的网站,也就是说他代理了这个访问过程,把结果返回给了我们。 这就是代理模式。
public interface Web {
// 处理请求
void processRequest();
}
public class Bilibili implements Web{
@Override
public void processRequest() {
System.out.println("你正在访问哔哩哔哩");
}
}
public class Client {
public static void main(String[] args) {
Web web = new Bilibili();
web.processRequest();
}
}
//国内无法访问的网站类
public class Youtube implements Web{
@Override
public void processRequest() {
System.out.println("你正在访问youtube");
}
}
//VPN模拟代理对象
public class VPN implements Web{
private Web web;
public VPN() {
}
public void setWeb(Web web) {
login();
charge();
this.web = web;
close();
}
@Override
public void processRequest() {
web.processRequest();
}
private void login() {
System.out.println("登录VPN");
}
private void charge() {
System.out.println("给VPN充值");
}
private void close() {
System.out.println("关闭VPN");
}
}
//通过VPN 我们可以访问YouTube 也就是通过代理我们可以访问无法访问的对象
public class Client {
public static void main(String[] args) {
Web web = new Youtube();
VPN vpn = new VPN();
vpn.setWeb(web);
vpn.processRequest();
}
}