当前位置: 首页 > news >正文

设计模式03———包装器模式 c#

首先我们打开一个项目

在这个初始界面我们需要做一些准备工作

创建基础通用包

创建一个Plane 重置后 缩放100倍 加一个颜色

(个人喜好)调节渐变色 可更改同种颜色的色调  

(个人喜好) 调节天空盒

准备工作做完后   接下我们做【包装器模式】

现在我对包装器模式说一下自己的理解:

包装器模式 又称 适配者模式 不管是哪个名字都是这个模式下的一个扮演角色

我更喜欢称这个模式为包装器模式 。

包装器模式是一种 结构型 设计模式,它能使接口不兼容的对象能够相互合作。

使接口不兼容的对象能够相互合作    就是这个模式最大的特点   

我举个例子  圆孔耳机  插不进去  方口手机   但是只需要一个 圆口转方口的转换器 就可以听音乐了

所以说,包装器 一共有三个类

【适配者类】                          相当于                   圆孔耳机

【可抽象包装器类】               相当于                   转换器

【目标类】                             相当于                   方口手机

最后我们通过Main继承MoNo挂载在脚本上调用即可

任务:按Q键实现   红色方块下落    到黑色木板上   黑色木板数值减少    红色模板数值增加

解释:不同颜色代表不同接口   红色方块 通过 黑色转换器 将数值传递给 没接触的红色木板

说一下完成任务的整体思路:

1.Main类

2.包装器类

3.适配者类

4.目标类

即完成了红色方块 落在黑色模板上 也可以使红色模板数值增加

在实现代码前,我们需要在unity场景中做几个预制体方便我们运行后自动生成

给小方块添加一个重力 使其掉落在黑色木板上

测试一下

接下来我们改名字为 

红色方块 = 适配者 Adaptor

黑色木板 = 包装器 Wrapper

 红色木板 = 目标类 Target

创建UI-Text显示数值

将Canvas下的Text改成AdaptorText

调Canvas的世界坐标方便我们调节他的长度和高度

调整后随便输入个数值

如果发现数值看不清就需要调节Canvas的清晰度

ctrl + d复制一个Canvas

将另一个的子类改名TargetText

将子类是AdaptorText的Canvas放在Wrapper包装器类作为Wrapper的子类

将子类是TargetText的Canvas放在Target目标类作为Target的子类

做好后将这个三物体放进预制体包 并在场景中删除

实现:

1.【适配者Adaptor类】

using UnityEngine;
public class Adaptor {
    //1.封装  适配者类 
    public float StoneNum { get; set; } = 100000f;//总体能量
    public float CurrentStoneNum { get; set; }//储存能量
    public string Energy { get; set; } = "魔法能量";
    private GameObject _modelObj;//模型
    public GameObject PrefabObj;//预制体引用
    public Adaptor(float energy){
        StoneNum = energy;
        CurrentStoneNum = energy;
        if (_modelObj == null)
            _modelObj = Resources.Load("Prefabs/Adaptor") as GameObject;
        if (PrefabObj == null)
            PrefabObj = GameObject.Instantiate(_modelObj, new Vector3(0f, 20f, 0f), Quaternion.identity);
    }
    //2.减少能量函数
    //减少目标能量
    public float Reduce(float num){
        if (CurrentStoneNum > num)
            CurrentStoneNum -= num;
        else
            CurrentStoneNum = 0;
        return StoneNum - CurrentStoneNum;//已经抽取的能量数量
    }
}

2.【包装器类】

using UnityEngine;
using UnityEngine.UI;
public class Wrapper{
    //1.封装 包装器
    private Adaptor _adaptor;//魔法能量晶石引用
    private Target _target;//能量水晶版引用
    private const float convert = 10f;//能量转换比率
    private GameObject _modelObj;//模型
    public GameObject PrefabObj;//预制体引用
    private Text _TargetText;//显示能量文本
    public Wrapper(Adaptor adaptor, Target target){
        _adaptor = adaptor;
        _target = target;
        _modelObj = Resources.Load("Prefabs/Wrapper") as GameObject;
        if (_modelObj != null){
            PrefabObj = GameObject.Instantiate(_modelObj, new Vector3(0f, 5f, 0f), Quaternion.identity);
            if (PrefabObj != null){
                _TargetText = PrefabObj.transform.Find("Canvas/AdaptorText").GetComponent<Text>();
                Debug.Log(_TargetText);
                _TargetText.text = adaptor.CurrentStoneNum.ToString();
            }
        }
    }
    //2.显示当前适配者数值
    public void ShowAdaptorlCurrentNum(){
        //显示能量石存储的能量值
        if (_TargetText != null)
            _TargetText.text = _adaptor.CurrentStoneNum.ToString();
    }
    //3.转换函数:接收主函数协程函数每0.2秒传递的数值
    //并且通过每0.2接收的数值让适配者逐渐减少
    //再通过将减少的数值传递给目标类使其增加
    //转换方法
    public void ConvertEnergy(float num){
        //抽取魔法能量
        float extractedMagicenergy = _adaptor.Reduce(num);
        //转换成电力能量
        float convertElectricEnergy = extractedMagicenergy * convert;
        //存储到水晶板中
        _target.Increase(convertElectricEnergy);
        ShowAdaptorlCurrentNum();
    }
}
3.【目标类】

using UnityEngine;
using UnityEngine.UI;
public class Target {
    //1.封装   目标类
    public float Stone1Num { get; set; } = 100000f;//总体能量
    public float CurrentStone1Num { get; set; }//储存能量
    //能量属性
    public string Energy1 { get; set; } = "电力能量";
    private GameObject _modelObj;//模型
    public GameObject PrefabObj;//预制体引用
    private Text _TargetText;//显示能量文本
    public Target(float energy1, float energy){
        Stone1Num = energy1;
        CurrentStone1Num = energy;
        _modelObj = Resources.Load("Prefabs/Target") as GameObject;
        if (_modelObj != null){
            PrefabObj = GameObject.Instantiate(_modelObj, new Vector3(20f, 5f, 0f), Quaternion.identity);
            //查找UI文本
            if (PrefabObj != null){
                _TargetText = PrefabObj.transform.Find("Canvas/TargetText").GetComponent<Text>();
                Debug.Log(_TargetText);
            }
            if (_TargetText != null)
                _TargetText.text = CurrentStone1Num.ToString();
        }
    }
    //2.增加能量函数
    //增加目标能量
    public void Increase(float num){
        //存储没能量的计算逻辑
        CurrentStone1Num += num;
        if (CurrentStone1Num > Stone1Num)
            CurrentStone1Num = Stone1Num;//确保不超过最大值
        //显示电力值文本
        _TargetText.text = CurrentStone1Num.ToString();
    }
}

4.【控制挂载类】

using System.Collections;
using UnityEngine;
public class Main : MonoBehaviour{
    Wrapper _wrapper;
    Adaptor _adaptor;
    Target _target;
    void Start(){
        //实例化(运行即创建)三个物体 :
        //【适配者】黑色方块 【包装器】转换器 【目标类】红色方块
        _adaptor = new Adaptor(500f);
        //能量水晶板
        _target = new Target(5000000f, 50f);
        //能量水晶板
        _wrapper = new Wrapper(_adaptor, _target);
        //_wrapper.ConvertEnergy(30f);
    }
    //协程函数:通过协程完成每0.2秒钟 传递给 包装器类一个数值
    private IEnumerator ConverEnergyRoutine()
    {
        while (_adaptor.CurrentStoneNum > 0)
        {
            _wrapper.ConvertEnergy(1f);
            yield return new WaitForSeconds(0.2f);
        }
    }
    void Update(){
        //按Q键开启协程函数
        if (Input.GetKeyDown(KeyCode.Q))
            StartCoroutine(ConverEnergyRoutine());
    }
}
最后回到unity场景中创建一个空物体起名为Obj

运行后    按Q键

          

相关文章:

设计模式03———包装器模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 创建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 &#xff08;个人喜好&#xff09;调节渐变色 可更改同种颜色的色调 &#xff08;个人喜好&#xff09; 调节天空盒 准备工作做完后 接下我们做【…...

《动手学深度学习 Pytorch版》 8.3 语言模型和数据集

8.3.1 学习语言模型 依靠在 8.1 节中对序列模型的分析&#xff0c;可以在单词级别对文本数据进行词元化。基本概率规则如下&#xff1a; P ( x 1 , x 2 , … , x T ) ∏ t 1 T P ( x t ∣ x 1 , … , x t − 1 ) P(x_1,x_2,\dots,x_T)\prod^T_{t1}P(x_t|x_1,\dots,x_{t-1}) …...

Linux桌面环境(桌面系统)

早期的 Linux 系统都是不带界面的&#xff0c;只能通过命令来管理&#xff0c;比如运行程序、编辑文档、删除文件等。所以&#xff0c;要想熟练使用 Linux&#xff0c;就必须记忆很多命令。 后来随着 Windows 的普及&#xff0c;计算机界面变得越来越漂亮&#xff0c;点点鼠标…...

【LeetCode刷题(数据结构)】:二叉树的前序遍历

给你二叉树的根节点root 返回它节点值的前序遍历 示例1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;root [1] 输出&#xff1a;[1] 示例…...

自定义Flink kafka连接器Decoding和Serialization格式

前言 使用kafka连接器时&#xff1a; 1.作为source端时&#xff0c;接受的消息报文的格式并不是kafka支持的格式&#xff0c;这时则需要自定义Decoding格式。 2.作为sink端时&#xff0c;期望发送的消息报文格式并非kafka支持的格式&#xff0c;这时则需要自定义Serializati…...

推荐八个大学搜题软件和学习工具哪个好用且免费,一起对比看看

以下分享的软件提供了各种实用的功能&#xff0c;如数学公式计算、语文阅读辅助等&#xff0c;让大学生们在学习过程中更加高效和便利。 1.九超查题 这是一个老公众号了&#xff0c;我身边的很多朋友都在用&#xff0c;支持超新星、学习强国、知到、智慧树和各类专业网课题目…...

SpringBoot面试题1:什么是SpringBoot?为什么要用SpringBoot?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:什么是SpringBoot? Spring Boot 是一个用于快速开发独立的、基于 Spring 框架的应用程序的开源框架。它简化了 Spring 应用的配置和部署过程,使…...

Django Test

Django--Laboratory drug management and early warning system-CSDN博客 创建项目doinglms django-admin startproject doinglms python manage.py runserver 运行开发服务器(Development Server) 创建一个自定义 App,名称为 lms: python manage.py startapp lms...

Linux- 自定义一个ARP请求

自定义一个ARP请求或响应&#xff0c;并使用AF_PACKET套接字发送&#xff0c;需要手动创建整个以太网帧。 下面是一个简单的C代码示例&#xff0c;用于发送一个ARP请求&#xff0c;查询给定IP地址的MAC地址&#xff1a; #include <stdio.h> #include <stdlib.h> …...

C++下载器程序:如何使用cpprestsdk库下载www.ebay.com图片

本文介绍了如何使用C语言和cpprestsdk库编写一个下载器程序&#xff0c;该程序可以从www.ebay.com网站上下载图片&#xff0c;并保存到本地文件夹中。为了避免被网站屏蔽&#xff0c;我们使用了亿牛云爬虫代理服务提供的代理IP地址&#xff0c;以及多线程技术提高下载效率。 首…...

java springboot通过EnableConfigurationProperties全局声明bean并处理装配

Spring Boot中 我们想条件装配一个类 首先 我们要声明他的bean 而 EnableConfigurationProperties 可以直接将 要全局声明的类绑定在 属性类中 例如 我们随便创建一个类 就叫 textData 吧 参考代码如下 package com.example.webdom.domain;import org.springframework.boot.co…...

网络工程师知识点2

21、VLAN 有什么作用&#xff1f; ①广播控制&#xff1b;②安全性&#xff1b;③增加带宽利用率&#xff1b;④减少延迟。 22、实际的项目中如何划分vlan的&#xff1f; 采用静态VLAN的划分方式&#xff0c;可以按照楼层划分&#xff0c;可以按安装科室划分 23、vlan 的链路…...

Vue 绑定style和class

在应用界面中&#xff0c;某些元素的样式是动态的。class 与 style 绑定就是专门用来实现动态样式效果的技术。 如果需要动态绑定 class 或 style 样式&#xff0c;可以使用 v-bind 绑定。 绑定 class 样式【字符串写法】 适用于&#xff1a;类名不确定&#xff0c;需要动态指…...

【Electron+Vue】Error: error:0308010C:digital envelope routines::unsupported

问题描述 使用 electron-builder 构建 vue 项目&#xff0c;运行 npm run electron:build &#xff0c;构建过程报错。 / Bundling main process...ERROR Failed to compile with 1 errors …...

第7章 验证你的 Micro SaaS 应用程序构想

虽然可以使用一些软性验证技术,但要完全验证你的 Micro SaaS 创意,其实只有一种方法:为你的应用程序打造一个最基本的 MVP(最小化可行产品)版本,把它放出去,看看人们是否愿意为它买单。 不过,在开始构建 MVP 之前,您也可以利用一些软性验证检查,然后再继续编写应用程…...

【微服务部署】七、使用Docker安装Nginx并配置免费的SSL证书步骤详解

SSL&#xff08;Secure Socket Layer&#xff0c;安全套接字层&#xff09;证书是一种数字证书&#xff0c;用于加密网站与访问者之间的数据传输。SSL证书是网站安全和可靠性的重要保证&#xff0c;是建立信任和保护用户隐私的重要手段。其作用可以总结为以下几点&#xff1a; …...

【Java 进阶篇】JavaScript 中的全局对象和变量

JavaScript 是一门非常强大的编程语言&#xff0c;它提供了许多全局对象和变量&#xff0c;以便于在整个应用程序中共享数据和功能。本文将详细介绍 JavaScript 中的全局对象和变量&#xff0c;包括全局对象、全局变量、全局函数以及它们的用途和示例。 全局对象 JavaScript …...

Stm32_标准库_12_串口_发送数据

波特率&#xff1a;约定的传输速率&#xff0c;1000bps,1s发1000位 引脚 结构 数据帧的传输特点 代码&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h"GPIO_InitTypeDef GPIO_InitStruct; USART…...

“之江创客”跨境电商赛区决赛暨浙南新电商发展论坛圆满落幕

9月26日&#xff0c;由商务部中国国际电子商务中心指导&#xff0c;浙江省商务厅等十个部门主办&#xff0c;浙江省电子商务促进中心、温州市商务局、苍南县人民政府承办的“之江创客”2023全球电子商务创业创新大赛跨境电商赛区决赛暨浙南新电商发展论坛在苍南圆满落幕。浙江省…...

使用antd-pro脚手架搭建react ts项目

Pro 中使用 TypeScript 来作为默认的开发语言&#xff0c;TypeScript 的好处已经无须赘述&#xff0c;无论是开发成本还是维护成本都能大大减少&#xff0c;是中后台开发的必选。 初始化 提供了 pro-cli 来快速的初始化脚手架。 # 使用 npm npm i ant-design/pro-cli -g pro…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...