返回

18.适配器模式

将一个类的接口转换成客户端期待的类接口。适配器模式让原本接口不符合的东西转换成符合的状态。

适配器模式

将一个类的接口转换成客户端期待的类接口。适配器模式让原本接口不符合的东西转换成符合的状态。

适配器模式的定义

当出现一个不符合客户端接口的情况时,在不想破坏接口的前提下,就必须设计一个适配器来进行转换,将原本不符合的接口,转换到客户端预期的接口上,所以概念上是非常简单的。

参与者说明如下:

  • Client(客户端):客户端预期使用的是Target目标接口的对象
  • Target(目标接口):定义提供给客户端使用的接口
  • Addaptee(被转换类):与客户端预期接口不同的类
  • Adapter(适配器)
    • 继承自 Target 目标接口,让客户端可以操作
    • 包含 Adaptee 被转换类,可以设为引用或组合
    • 实现 Target 的接口方法 Request 时,应调用适当的 Adaptee 方法来完成实现

具体实现

    // 應用域領(Client)所需的介面
    public abstract class Target
    {
        public abstract void Request();
    }

    // 不同於應用域領(Client)的實作,需要被轉換
    public class Adaptee
    {
        public Adaptee()
        {
        }

        public void SpecificRequest()
        {
            Debug.Log("呼叫Adaptee.SpecificRequest");
        }
    }

    // 將Adaptee轉換成Target介面
    public class Adapter : Target
    {
        private Adaptee m_Adaptee = new Adaptee();

        public Adapter()
        {
        }

        public override void Request()
        {
            m_Adaptee.SpecificRequest();
        }
    }

使用适配器模式的优点

虽然适配器模式,看似只不过是将同项目下的不同类型进行转换,但适配器模式其实也具有减少项目依赖第三方函数库的好处。游戏项目在开发时常常会引入第三方工具/函数库来强化游戏功能,但一经引用就代表项目被绑定在第三方工具/函数库了。此时罗没有适当的方式,将项目与第三方工具函数库进行隔离,那么当第三方工具/函数库进行大规模改动时,或是想要替换成另一套相同功能的工具/函数库时,都可能引发项目大规模的修改。

在这个时候,适配器模式可以适时扮演分离项目与第三方工具/函数库的角色。在项目内先自行定义功能使用接口,在利用适配器模式,将真正执行的第三方工具运用在子类实现之中,以此来形成隔离。若有多个第三方函数库可以选择时,对于项目而言,就不会造成太多转换上的困扰。

适配器模式的应用

载具的驾驶系统会因为载具类型的不同而有所差异。早期设计时若时没有通判考虑,很可能设计出让角色很难驾驭的驾驶系统。同样地,如果是在游戏开发后期才发现这个问题,游戏企划可能希望某角色去操作原本没有规划在内的载具,那么此时就可以利用适配器模式来作为两个驾驶系统之间的转接。