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

首先我们打开一个项目

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

创建基础通用包

设计模式03———包装器模式 c#_第1张图片

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

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

设计模式03———包装器模式 c#_第2张图片

(个人喜好) 调节天空盒

设计模式03———包装器模式 c#_第3张图片

设计模式03———包装器模式 c#_第4张图片

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1.Main类

设计模式03———包装器模式 c#_第5张图片

2.包装器类

设计模式03———包装器模式 c#_第6张图片

3.适配者类

设计模式03———包装器模式 c#_第7张图片

4.目标类

设计模式03———包装器模式 c#_第8张图片

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

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

设计模式03———包装器模式 c#_第9张图片

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

设计模式03———包装器模式 c#_第10张图片

测试一下

设计模式03———包装器模式 c#_第11张图片

接下来我们改名字为 

红色方块 = 适配者 Adaptor

黑色木板 = 包装器 Wrapper

 红色木板 = 目标类 Target

设计模式03———包装器模式 c#_第12张图片

创建UI-Text显示数值

设计模式03———包装器模式 c#_第13张图片

将Canvas下的Text改成AdaptorText

设计模式03———包装器模式 c#_第14张图片

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

设计模式03———包装器模式 c#_第15张图片

调整后随便输入个数值

设计模式03———包装器模式 c#_第16张图片

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

设计模式03———包装器模式 c#_第17张图片

ctrl + d复制一个Canvas

设计模式03———包装器模式 c#_第18张图片

将另一个的子类改名TargetText

设计模式03———包装器模式 c#_第19张图片

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

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

设计模式03———包装器模式 c#_第20张图片

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

实现:

1.【适配者Adaptor类】

设计模式03———包装器模式 c#_第21张图片

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.【包装器类】

设计模式03———包装器模式 c#_第22张图片

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();
                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.【目标类】

设计模式03———包装器模式 c#_第23张图片

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();
                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.【控制挂载类】

设计模式03———包装器模式 c#_第24张图片

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

设计模式03———包装器模式 c#_第25张图片

设计模式03———包装器模式 c#_第26张图片

运行后    按Q键

设计模式03———包装器模式 c#_第27张图片

设计模式03———包装器模式 c#_第28张图片

设计模式03———包装器模式 c#_第29张图片

          

你可能感兴趣的:(设计模式)