Unity 设计模式 之 结构型模式 -【适配器模式】【桥接模式】 【组合模式】

Unity 设计模式 之 结构型模式 -【适配器模式】【桥接模式】 【组合模式】

目录

Unity 设计模式 之 结构型模式 -【适配器模式】【桥接模式】 【组合模式】

一、简单介绍

二、适配器模式 (Adapter Pattern)

1、什么时候使用适配器模式

2、使用适配器模式的好处

3、适配器模式的注意事项

三、在 Unity 中使用 适配器模式

1、定义目标接口 IModelLoader

2、模拟不同的 3D 模型加载器

2.1 OBJ 模型加载器

2.2 FBX 模型加载器

3、创建适配器

3.1 OBJ 模型适配器

3.2 FBX 模型适配器

4、在 Unity 场景中使用适配器模式

5、运行结果分析

四、桥接模式(Bridge Pattern)

1、什么时候使用桥接模式

2、使用桥接模式的好处

五、在 Unity 中使用 桥接模式

1、定义渲染接口 IRenderer

2、实现具体的渲染类

2.1 标准材质渲染器 StandardMaterialRenderer

2.2 自定义材质渲染器 CustomMaterialRenderer

3、定义抽象类 Shape

4、创建具体的形状类

4.1 立方体类 Cube

4.2 球体类 Sphere

5、在 Unity 场景中使用桥接模式

6、运行分析

六、组合模式(Composite Pattern)

1、什么时候使用组合模式

2、使用组合模式的好处

3、使用组合模式时的注意事项

七、在 Unity  中使用 组合模式

1、定义组件接口 IShape

2、实现叶子节点类

2.1 立方体 Cube

2.2 球体 Sphere

2.3 圆柱体 Cylinder

3、实现组合节点 ShapeGroup

4、在 Unity 中使用组合模式

5、运行分析


一、简单介绍

设计模式 是指在软件开发中为解决常见问题而总结出的一套 可复用的解决方案。这些模式是经过长期实践证明有效的 编程经验总结,并可以在不同的项目中复用。设计模式并不是代码片段,而是对常见问题的 抽象解决方案,它提供了代码结构和模块间交互的一种设计思路,帮助开发者解决特定的设计问题。

设计模式的特点:

  1. 通用性:设计模式针对的是软件开发中常见的设计问题,适用于各种软件工程项目。
  2. 可复用性:设计模式可以在不同项目和环境下被重复使用,提高代码的可维护性和扩展性。
  3. 可扩展性:设计模式有助于让代码结构更加灵活,易于扩展和修改。
  4. 模块化:通过设计模式,可以减少代码的耦合性,增强模块间的独立性。
  5. 提高沟通效率:设计模式为开发者提供了一种通用的设计语言,使得团队成员能够快速理解并讨论设计方案。

二、适配器模式 (Adapter Pattern)

适配器模式 (Adapter Pattern) 是一种结构型设计模式,作用是将一个类的接口转换为客户希望的另一个接口。适配器使得原本由于接口不兼容而不能一起工作的类可以协同工作。

在开发中,适配器模式通常用于解决现有类和新接口不兼容的问题,而无需修改现有代码。它的核心思想是创建一个适配器类,使得不同接口之间的转换变得透明。

适配器模式有两种主要实现方式:

  1. 对象适配器:通过组合的方式,适配器类持有一个被适配的对象,并将调用委托给该对象。
  2. 类适配器:通过继承的方式,适配器类继承自需要适配的类,同时实现目标接口。

1、什么时候使用适配器模式

  1. 系统需要使用现有的类,但这个类的接口与系统的接口不兼容时。适配器模式可以在不修改现有类的情况下,使其接口适应新的需求。

  2. 你想复用旧代码,并且不想修改旧代码或违反开闭原则时。适配器模式允许你使用旧代码,而不需要更改现有代码库。

  3. 需要将类整合到一个不兼容的框架中,而又不希望改动类的定义时。通过适配器模式,你可以创建一个中间层,让新框架能够使用旧类。

  4. 集成第三方库:当引入第三方库时,它们的接口可能与现有代码的需求不一致。通过适配器模式,可以实现接口之间的转换,顺利进行集成。

2、使用适配器模式的好处

  1. 提高代码的复用性:适配器模式允许复用现有的类和库,无需修改其源代码。通过适配器,你可以将现有类无缝集成到新的系统中,而无需重写它们。

  2. 解决接口不兼容问题:当你需要使用一个现有类,但它的接口不符合你当前项目的需求时,可以通过适配器模式解决这一问题。适配器可以“翻译”接口,使得不兼容的类能够在一起工作。

  3. 支持旧系统的集成:在软件开发中,项目经常需要集成遗留系统或者第三方库。适配器模式能够很好地帮助你将这些遗留系统整合到新的系统中,扩展其功能而不需要修改旧代码。

  4. 分离客户端代码与具体实现:适配器模式将客户端代码与实际实现分离,这使得客户端代码可以适应未来的变化,比如新的接口或实现方式的引入。

3、适配器模式的注意事项

  1. 适配器本身需要额外的代码:引入适配器可能会增加系统的复杂性,尤其是当涉及多个适配器时。要权衡适配器的引入是否真正有必要。

  2. 可能引入性能开销:适配器模式通过引入中间层来解决接口不兼容问题,这可能在某些场景下增加调用的性能开销,特别是在大量频繁的接口调用时。

  3. 适配的灵活性:适配器的实现应该尽可能保持灵活,避免过于依赖具体的实现类。确保适配器可以应对接口或实现方式的变化。

总之,适配器模式 用于解决不兼容接口之间的转换问题,提供了将现有类复用到新环境中的灵活机制。它的主要好处是提高代码的复用性和扩展性,尤其适合在需要集成旧代码或第三方库时使用。通过适配器模式,开发者可以在不修改原始类的情况下,兼容不同接口,使系统更加灵活和可扩展。

三、在 Unity 中使用 适配器模式

在 Unity 中,我们可以使用适配器模式来处理不同类型的 3D 对象渲染,例如不同的 3D 模型格式(比如 OBJFBXGLTF 等)或不同的材质处理方式。通过适配器模式,可以将这些不同的 3D 模型格式转换成统一的接口来使用。

我们将模拟一个场景,其中需要加载不同格式的 3D 模型。通过适配器模式,我们可以创建一个统一的接口,让系统无论加载哪种格式的模型,都会以相同的方式进行操作。

步骤概述:

  1. 定义一个目标接口 IModelLoader,它用于统一加载模型的接口。
  2. 实现不同的 3D 模型加载器,比如 ObjModelLoaderFbxModelLoader,它们各自处理不同格式的模型。
  3. 创建适配器,将这些不同的加载器适配到 IModelLoader 接口。
  4. 使用适配器,在场景中加载不同格式的模型。

参考类图如下:

1、定义目标接口 IModelLoader

该接口定义了一个加载模型的方法 LoadModel(),通过这个接口,我们可以统一管理不同格式的模型加载。

public interface IModelLoader
{
    void LoadModel();
}

2、模拟不同的 3D 模型加载器

在这个示例中,我们会模拟两个不同的 3D 模型加载器,一个用于加载 OBJ 模型,另一个用于加载 FBX 模型。

2.1 OBJ 模型加载器
using UnityEngine;

public class ObjModelLoader
{
    public void LoadObjModel()
    {
        Debug.Log("Loading OBJ model...");
        // 模拟加载 OBJ 模型
        GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        cube.GetComponent<Renderer>().material.color = Color.blue;
    }
}
2.2 FBX 模型加载器
using UnityEngine;

public class FbxModelLoader
{
    public void LoadFbxModel()
    {
        Debug.Log("Loading FBX model...");
        // 模拟加载 FBX 模型
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.GetComponent<Renderer>().material.color = Color.red;
    }
}

3、创建适配器

我们将创建适配器类,将 ObjModelLoaderFbxModelLoader 适配为统一的 IModelLoader 接口。

3.1 OBJ 模型适配器
public class ObjModelAdapter : IModelLoader
{
    private ObjModelLoader objModelLoader;

    public ObjModelAdapter(ObjModelLoader loader)
    {
        objModelLoader = loader;
    }

    public void LoadModel()
    {
        objModelLoader.LoadObjModel();
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仙魁XAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值