设计模式——代理模式
介绍
创建已有对象的代理,添加相应的控制后便于向外界提供访问。
意图
为其他对象提供一种代理以控制原对象的访问。
解决
避免直接访问对象(安全问题,权限问题等),相当于为原对象添加访问控制层。
优点
- 扩展性
- 职责清晰
缺点
- 在原对象上添加一层访问控制,会使请求变慢
使用场景
- 接口调用权限
- 防火墙
- 前置机
UML
示例
Ticketing.java
package cn.geoaryblog.design.cretedg.proxy;
public interface Ticketing {
String buy();
}
OfficialTicketing.java
package cn.geoaryblog.design.cretedg.proxy;
public class OfficialTicketing implements Ticketing {
@Override
public String buy() {
return "官方12306购票系统-票价【100元】";
}
}
ProxyTicketing.java
package cn.geoaryblog.design.cretedg.proxy;
public class ProxyTicketing implements Ticketing {
private OfficialTicketing officialTicketing;
private int userid;
public ProxyTicketing(int userid){
this.userid = userid;
}
@Override
public String buy() {
// 通过代理类对被代理对象扩展(控制)
if(userid != 234){
return "该用户无法通过【智行】购票";
}
if(officialTicketing == null){
officialTicketing = new OfficialTicketing();
}
String thirdPartyTitle = "智慧你的旅行-智行";
String thirdPartyTicket = "手续费【20元】,原价【100元】,总计【120元】";
return thirdPartyTitle+"\n"+thirdPartyTicket;
}
}
Client.java
package cn.geoaryblog.design.cretedg.proxy;
public class Client {
public static void main(String[] args) {
ProxyTicketing proxy1 = new ProxyTicketing(234);
ProxyTicketing proxy2 = new ProxyTicketing(123);
System.out.println("用户234通过智行购票");
System.out.println(proxy1.buy());
System.out.println();
System.out.println("用户123通过智行购票");
System.out.println(proxy2.buy());
}
}
// 输出结果
// 用户234通过智行购票
// 智慧你的旅行-智行
// 手续费【20元】,原价【100元】,总计【120元】
//
// 用户123通过智行购票
// 该用户无法通过【智行】购票
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】