【设计模式深度剖析】【1】【结构型】【代理模式】| 玩游戏打怪、升级为例加深理解

news2024/11/18 19:28:35

👈️上一篇:创建型设计模式对比    |   下一篇:装饰器模式👉️

目 录

  • 代理模式
  • 定义
    • 英文原话
    • 直译
    • 如何理解?
  • 3个角色
    • UML类图
    • 1. 抽象主题(Subject)角色
    • 2. 代理类:代理主题(Proxy Subject)角色
    • 3. 被代理类:真实主题(Real Subject)角色
    • 代码示例
      • 1. 真实主题,被代理类
      • 2. 抽象主题
      • 3. 代理类
      • 4. 测试类
  • 代理模式的种类
  • 代理模式的优点
  • 示例解析:玩游戏打怪、升级示例
    • UML类图
    • 1. 真实主题RealSubject:GamePlayer实现IGamePlayer接口中的方法
    • 抽象主题Subject:IGamePlayer接口对游戏玩家进行抽象
    • 代理主题ProxySubject:GamePlayerProxy是代理类
    • 测试类

代理模式

定义

英文原话

Provide a surrogate or placeholder for another object to control access to it.

直译

为另一个对象提供代理或占位符以控制对它的访问

如何理解?

字面上不好理解的话可以结合代码进一步理解下,从具体实现上分析:

抽象主题角色,是对被代理类的抽象,被代理类就看作是对抽象主题角色类的实现,被代理类的实现就是核心功能的实现

同时,代理对象中持有被代理对象的引用,

代理类也实现了被代理类相同的接口,

这样,通过代理类可以增强被代理类的逻辑,

在被代理对象的逻辑前后可以增加一些逻辑,比如获取请求参数,添加日志等,这些非核心的逻辑,可以在代理类中进行增强。

代理模式应用非常广泛,大到一个系统框架、企业平台,小到事务处理、代码片段,随处可见代理模式的使用,例如,Java RMI的远程调用就是一种代理模式的应用,AOP也可以通过代理模式实现。

3个角色

UML类图

proxy.png

1. 抽象主题(Subject)角色

该角色是真实主题和代理主题的共同接口,以便在任何可以使用真实主题的地方都可以使用代理主题。

2. 代理类:代理主题(Proxy Subject)角色

也叫做委托类、代理类,该角色负责控制对真实主题的引用,负责在需要的时候创建或删除真实主题对象,并且在真实主题角色处理完毕前后做预处理和善后处理工作。

3. 被代理类:真实主题(Real Subject)角色

该角色也叫做被委托角色、被代理角色,是业务逻辑的具体执行者。

代码示例

1. 真实主题,被代理类

package com.polaris.designpattern.list2.structural.pattern1.proxy.proto;

public class Target implements AbstractSubject {

    @Override
    public void m1() {
        System.out.println("target implements. Core business logic");
    }
}

2. 抽象主题

抽取核心业务逻辑接口方法m1()出来,该方法源自被代理对象,因此被代理类的m1()方法就可以看作是对它的实现,被代理类添加 implements AbstractSubject表示对抽象主题的实现;

package com.polaris.designpattern.list2.structural.pattern1.proxy.proto;

public interface AbstractSubject {
    void m1();
}

3. 代理类

代理被代理的类,对被代理类的逻辑(抽象主题进行了抽象)进行增强,

前提是代理类实现了抽象主题的抽象方法,同时持有被代理类的对象(可通过构造函数传入)

注意这里的构造函数传入的是Target实例,更通用的可以使用抽象主题角色AbstractSubject类型;

package com.polaris.designpattern.list2.structural.pattern1.proxy.proto;

public class Proxy implements AbstractSubject {

    private Target target;

    public Proxy(Target target) {
        this.target = target;
    }

    @Override
    public void m1() {
        before();
        target.m1();
        after();
    }

    private void before() {
        System.out.println("enhanced logic: before...");
    }

    private void after() {
        System.out.println("enhanced logic: after...");
    }
}

4. 测试类

package com.polaris.designpattern.list2.structural.pattern1.proxy.proto;

public class DemoTest {
    public static void main(String[] args) {
        Target target = new Target();
        Proxy proxy = new Proxy(target);
        proxy.m1();
    }
}

/* Output:
enhanced logic: before...
target implements. Core business logic
enhanced logic: after...
*///~

代理模式的种类

简单了解一下:

  1. 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局部代表对象。这个不同的地址空间可以是在本机器中,也可以在另一台机器中。
  2. 虚拟(Virtual**)**代理:有时需要创建一些消耗较多资源的对象,可以首先创建代理对象,而将真实对象的创建延迟。例如,加载一个很大的图片,可以通过图片的代理来代替真正的图片。
  3. 保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。
  4. 缓存(Cache)代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
  5. 同步(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
  6. 智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,例如,记录访问的流量和次数等。

代理模式的优点

  1. 职责清晰真实的角色实现实际的业务逻辑,不用关心其他非本职的事务,通过后期的代理完成附加的事务,附带的结果就是编程简洁清晰。
  2. 高扩展性:具体主题角色随需求不同可能有很多种,但只要实现了接口,代理类完全可以不做任何修改的情况下代理各种真实主题角色
  3. 智能化:代理类可以在运行时才确定需要去代理的真实主题,这是一种强大的功能。

示例解析:玩游戏打怪、升级示例

UML类图

gamerproxy.png

  • 主题类和代理类同时实现接口
  • 主题类,就是被代理类,完成主要业务逻辑
  • 附加业务在代理类中完成
  • 客户端调用:
    • 声明接口的两个示例分别指向主题类与代理类的实例对象;
    • 其中,在代理类示例创建时传入主题类的实例(参数类型可以放大,参数定义为接口类型,当然主题类实现类此接口,属于此接口类型,可以被传入)。

1. 真实主题RealSubject:GamePlayer实现IGamePlayer接口中的方法

被代理类的具体实现,是最核心的业务逻辑,这里玩游戏最核心的就是打怪,升级;

package com.polaris.designpattern.list2.structural.pattern1.proxy;

public class GamePlayer implements IGamePlayer {
    private String name = "";

    public GamePlayer(String name) {
        this.name = name;
    }

    @Override
    public void killBoss() {
        System.out.println(this.name + "在打怪!");
    }

    @Override
    public void upGrade() {
        System.out.println(this.name + "成功升了1级!");
    }
}

抽象主题Subject:IGamePlayer接口对游戏玩家进行抽象

抽象主题,抽象出打怪升级两个核心业务逻辑,方便代理类进行实现,增强被代理类的逻辑

package com.polaris.designpattern.list2.structural.pattern1.proxy;

public interface IGamePlayer {
    //杀怪
    void killBoss();
    //升级
    void upGrade();
}

代理主题ProxySubject:GamePlayerProxy是代理类

代理主题,在被代理类的核心业务逻辑实现(打怪、升级)的基础上增加非核心业务逻辑:加日志、计时,

因此代理类是对被代理类的增强、强化

他持有被代理类的引用,通过构造函数初始化

package com.polaris.designpattern.list2.structural.pattern1.proxy;

import java.util.Date;

public class GamePlayerProxy implements IGamePlayer {

    private IGamePlayer player = null;

    public GamePlayerProxy(IGamePlayer player) {
        this.player = player;
    }

    //记录打怪的时间
    private void log() {
        System.out.println("打怪时间 " + new Date().toString());
    }

    @Override
    public void killBoss() {
        this.log();
        player.killBoss();
    }

    @Override
    public void upGrade() {
        player.upGrade();
        this.countTime();
    }

    //计时
    private void countTime() {
        System.out.println("升1级耗时50小时");
    }

}

测试类

package com.polaris.designpattern.list2.structural.pattern1.proxy;

public class DemoTest {
    public static void main(String[] args) {
        IGamePlayer player = new GamePlayer("李逍遥");
        IGamePlayer proxy = new GamePlayerProxy(player);
        proxy.killBoss();
        proxy.upGrade();
    }
}

/* Output:
打怪时间 Mon May 20 23:35:58 CST 2024
李逍遥在打怪!
李逍遥成功升了1级!
升1级耗时50小时
*///~

👈️上一篇:创建型设计模式对比    |   下一篇:装饰器模式👉️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1687524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Google Earth Engine(GEE)深度学习入门教程-Python数据读入篇

Python数据读入篇 前置条件: GEE预处理影像导出保存为tfrecord的数据包,并下载到本地tensorflow的深度学习环境 本篇文章的目的主要是把Tfrecord格式的数据加载为tf可使用的数据集格式 设定超参数 首先需要设定导出时的波段名称和数据格式&#xff…

leetcode437 路径总和III-哈希表+前缀和

题目 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节…

nginx开启资源目录

nginx开启资源目录表 可访问开放资源目录下的任何文件以及视频,图片等。可以作为一个妥妥的线上网盘资源托管空间使用。 上一篇文档揭示了nginx的神秘面纱,初步介绍与启动了nginx的基本功能和使用前端nginx学习配置开发验证,对各种配置已经…

Flutter容器

内边距padding class MyBody extends StatelessWidget {overrideWidget build(BuildContext context) {return Container(//为了可以看出内边距,将容器设置成红色color: Colors.red,child: Padding(padding: EdgeInsets.all(15),child: MyImage(https://raw.github…

SpheroGPT: 声控自然语言编程 AI 玩具 Demo 具身智能 图文解说 完全开源机器人

背景介绍 因为生病请了长假. 一周前状态开始恢复, 于是尝试用 LLM (ChatGPT3.5) + Sphero 开发一个可以声控自然语言编程的 AI 玩具, 作为学习 ChatGPT 应用开发的方法. 差不多十天时间把开发目标基本都实现了, 这里和大家分享一下心得体会. Demo 示例视频 先把录制的几个 d…

企业软件商城:管理路径与价值的全面解析

在现代企业的运营中,软件资产管理(SAM)的实施不仅仅是为了应对审计需要,更重要的是其对于企业持续健康发展的深远影响。本文将详细探讨软件合规性管理的多重意义,并分析如何通过恰当的环境选择和高效系统,提…

WPS PPT学习笔记 1 排版4原则等基本技巧整理

排版原则 PPT的排版需要满足4原则:密性、对齐、重复和对比4个基本原则。 亲密性 彼此相关的元素应该靠近,成为一个视觉单位,减少混乱,形成清晰的结构。 两端对齐,1.5倍行距 在本例中,19年放左边&#x…

淄博公司商标驳回复审条件及流程

商标是人工审查的,所以不同的人会有不同的想法和意见,导致同一案件的审查结果不同。特别是商标审查周期缩短到5个月,全国平均每个工作日有1万多个商标提交申请,而全国只有一个商标审查单位——国家商标局提交申请。这种情况下&…

AI图书推荐:用100个ChatGPT提示词掌握Python编程

《用100个ChatGPT提示词掌握Python编程》(ChatGPT:Your Python Coach Mastering the Essentials in 100 Prompts) 塞尔吉奥罗哈斯-加莱亚诺(Sergio Rojas-Galeano)是一位热情的计算机科学家,对人工智能、机器学习、进化…

OceanBase数据库诊断调优,与高可用架构——【DBA从入门到实践】第八期

在学习了《DBA从入门到实践》的前几期课程后,大家对OceanBase的安装部署、日常运维、数据迁移以及业务开发等方面应当已经有了全面的认识。若在实际应用中遇到任何疑问或挑战,欢迎您在OceanBase社区问答论坛中交流、讨论。此次,《DBA从入门到…

在线投票系统源码 网上投票平台创建 安全稳定 支持自定义投票规则+礼物道具功能

分享一款在线投票系统源码,是一款功能丰富、安全稳定的网络投票平台解决方案。通过本源码,用户可以轻松创建并管理各种在线投票活动,支持自定义投票规则,同时集成礼物道具功能,增强用户参与度和投票活动的趣味性&#…

# 全面解剖 消息中间件 RocketMQ-(2)

全面解剖 消息中间件 RocketMQ-(2) 一、RocketMQ – RocketMQ 各角色介绍 1、RocketMQ 各角色介绍 Producer : 消息的发送者; 举例:发信者。Consumer : 消息接收者; 举例:收信者。Broker : 暂存和传输消息; 举例:邮局。NameServer : 管理 Broker; 举例…

数字人实训室解决方案

前言 近年来,政策层面的积极推动为数字人产业铺设了坚实的基石。2021年,“十四五”规划将虚拟数字技术纳入其中,强调技术创新引领行业应用的革新,加速数字人在各领域的实际应用。紧接着的《“十四五”数字经济发展规划》进一步明确…

CVE-2024-1561 Gradio component_server存在任意文件读取漏洞

声明: 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 简介 Gradio是一个用于构建快速原型和部署机器学习模型的…

集成环境 ClassNotFound 分析与排查

项目场景: 最近项目在集成环境,经常会报 ClassNotFound 异常, 而在开发环境通过IDEA查看项目,类是不缺的 原因分析: 经过排查,发现是项目中引用的 API jar包更新了,但是集成环境却没有成功更…

ATA-2081高压放大器的结构组成及原理是什么

高压放大器是一种电子设备,用于将低电压信号增强到高电压水平,以满足特定应用的需求。它们在各种领域中都有广泛的用途,包括医学成像、科学研究、通信系统和声学应用。下面西安安泰电子来为大家介绍高压放大器的结构组成和工作原理。 高压放大…

kafka Kerberos集群环境部署验证

背景 公司需要对kafka环境进行安全验证,目前考虑到的方案有Kerberos和SSL和SASL_SSL,最终考虑到安全和功能的丰富度,我们最终选择了SASL_SSL方案。处于知识积累的角度,记录一下kafka keberos安装部署的步骤。 机器规划 目前测试环境公搭建了三台kafka主机服务,现在将详细…

国家开放大学Java语言程序设计实验2:分支、循环和跳转语句的使用

作业答案 联系QQ:1603277115 实验目的 通过本实验,了解和掌握分支、循环和跳转语句的使用及常见问题处理。 问题描述 杂物店正在做促销活动,很多商品都在进行特价促销,针对特价商品的购买数量做了限制,具体的促销办法是&#…

基于物理的AlGaN/GaN高电子迁移率晶体管的紧凑直流和交流模型

来源:A Physics-Based Compact Direct-Current and Alternating-Current Model for AlGaN/GaN High Electron obility Transistors(中国物理快报 07年) 摘要 一套针对 AlGaN/GaN 高电子迁移率晶体管 (HEMT) 的直流和小信号特性的分析模型被…

2024年商业管理与文化传播国际学术会议(ICBMCC 2024)

2024年商业管理与文化传播国际学术会议(ICBMCC 2024) 2024 International Conference on Business Management and Cultural Communication 一、【会议简介】 2024年商业管理与文化传播国际学术会议(ICBMCC 2024)是一次汇集全球商业管理领域…