设计模式——代理模式

介绍

创建已有对象的代理,添加相应的控制后便于向外界提供访问。

意图

为其他对象提供一种代理以控制原对象的访问。

解决

避免直接访问对象(安全问题,权限问题等),相当于为原对象添加访问控制层。

优点

  1. 扩展性
  2. 职责清晰

缺点

  1. 在原对象上添加一层访问控制,会使请求变慢

使用场景

  1. 接口调用权限
  2. 防火墙
  3. 前置机

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通过智行购票
// 该用户无法通过【智行】购票
posted @   Geoary  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示