Unity 设计模式 之 结构型模式 -【适配器模式】【桥接模式】 【组合模式】
目录
Unity 设计模式 之 结构型模式 -【适配器模式】【桥接模式】 【组合模式】
2.1 标准材质渲染器 StandardMaterialRenderer
2.2 自定义材质渲染器 CustomMaterialRenderer
一、简单介绍
设计模式 是指在软件开发中为解决常见问题而总结出的一套 可复用的解决方案。这些模式是经过长期实践证明有效的 编程经验总结,并可以在不同的项目中复用。设计模式并不是代码片段,而是对常见问题的 抽象解决方案,它提供了代码结构和模块间交互的一种设计思路,帮助开发者解决特定的设计问题。
设计模式的特点:
- 通用性:设计模式针对的是软件开发中常见的设计问题,适用于各种软件工程项目。
- 可复用性:设计模式可以在不同项目和环境下被重复使用,提高代码的可维护性和扩展性。
- 可扩展性:设计模式有助于让代码结构更加灵活,易于扩展和修改。
- 模块化:通过设计模式,可以减少代码的耦合性,增强模块间的独立性。
- 提高沟通效率:设计模式为开发者提供了一种通用的设计语言,使得团队成员能够快速理解并讨论设计方案。
二、适配器模式 (Adapter Pattern)
适配器模式 (Adapter Pattern) 是一种结构型设计模式,作用是将一个类的接口转换为客户希望的另一个接口。适配器使得原本由于接口不兼容而不能一起工作的类可以协同工作。
在开发中,适配器模式通常用于解决现有类和新接口不兼容的问题,而无需修改现有代码。它的核心思想是创建一个适配器类,使得不同接口之间的转换变得透明。
适配器模式有两种主要实现方式:
- 对象适配器:通过组合的方式,适配器类持有一个被适配的对象,并将调用委托给该对象。
- 类适配器:通过继承的方式,适配器类继承自需要适配的类,同时实现目标接口。
1、什么时候使用适配器模式
系统需要使用现有的类,但这个类的接口与系统的接口不兼容时。适配器模式可以在不修改现有类的情况下,使其接口适应新的需求。
你想复用旧代码,并且不想修改旧代码或违反开闭原则时。适配器模式允许你使用旧代码,而不需要更改现有代码库。
需要将类整合到一个不兼容的框架中,而又不希望改动类的定义时。通过适配器模式,你可以创建一个中间层,让新框架能够使用旧类。
集成第三方库:当引入第三方库时,它们的接口可能与现有代码的需求不一致。通过适配器模式,可以实现接口之间的转换,顺利进行集成。
2、使用适配器模式的好处
提高代码的复用性:适配器模式允许复用现有的类和库,无需修改其源代码。通过适配器,你可以将现有类无缝集成到新的系统中,而无需重写它们。
解决接口不兼容问题:当你需要使用一个现有类,但它的接口不符合你当前项目的需求时,可以通过适配器模式解决这一问题。适配器可以“翻译”接口,使得不兼容的类能够在一起工作。
支持旧系统的集成:在软件开发中,项目经常需要集成遗留系统或者第三方库。适配器模式能够很好地帮助你将这些遗留系统整合到新的系统中,扩展其功能而不需要修改旧代码。
分离客户端代码与具体实现:适配器模式将客户端代码与实际实现分离,这使得客户端代码可以适应未来的变化,比如新的接口或实现方式的引入。
3、适配器模式的注意事项
-
适配器本身需要额外的代码:引入适配器可能会增加系统的复杂性,尤其是当涉及多个适配器时。要权衡适配器的引入是否真正有必要。
-
可能引入性能开销:适配器模式通过引入中间层来解决接口不兼容问题,这可能在某些场景下增加调用的性能开销,特别是在大量频繁的接口调用时。
-
适配的灵活性:适配器的实现应该尽可能保持灵活,避免过于依赖具体的实现类。确保适配器可以应对接口或实现方式的变化。
总之,适配器模式 用于解决不兼容接口之间的转换问题,提供了将现有类复用到新环境中的灵活机制。它的主要好处是提高代码的复用性和扩展性,尤其适合在需要集成旧代码或第三方库时使用。通过适配器模式,开发者可以在不修改原始类的情况下,兼容不同接口,使系统更加灵活和可扩展。
三、在 Unity 中使用 适配器模式
在 Unity 中,我们可以使用适配器模式来处理不同类型的 3D 对象渲染,例如不同的 3D 模型格式(比如 OBJ、FBX、GLTF 等)或不同的材质处理方式。通过适配器模式,可以将这些不同的 3D 模型格式转换成统一的接口来使用。
我们将模拟一个场景,其中需要加载不同格式的 3D 模型。通过适配器模式,我们可以创建一个统一的接口,让系统无论加载哪种格式的模型,都会以相同的方式进行操作。
步骤概述:
- 定义一个目标接口
IModelLoader,它用于统一加载模型的接口。- 实现不同的 3D 模型加载器,比如
ObjModelLoader和FbxModelLoader,它们各自处理不同格式的模型。- 创建适配器,将这些不同的加载器适配到
IModelLoader接口。- 使用适配器,在场景中加载不同格式的模型。
参考类图如下:

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、创建适配器
我们将创建适配器类,将 ObjModelLoader 和 FbxModelLoader 适配为统一的 IModelLoader 接口。
3.1 OBJ 模型适配器
public class ObjModelAdapter : IModelLoader
{
private ObjModelLoader objModelLoader;
public ObjModelAdapter(ObjModelLoader loader)
{
objModelLoader = loader;
}
public void LoadModel()
{
objModelLoader.LoadObjModel();
}
}

最低0.47元/天 解锁文章
1983

被折叠的 条评论
为什么被折叠?



