适配器模式

前言

适配器模式从实现方式上分为三种,类适配器和对象适配器还有缺省适配器。它们区别在于实现方式和实际使用场景不同。

1.各种适配器详解


  • 类适配器

当我们需要把游戏发布到Stream平台时,Stream提供的SDK可能需要我们接上游戏的启动,重置等等接口。这个和游戏本身的接口是不一样的,所以这个时候我们需要适配器去实现这个功能,首先模拟出游戏自身相关代码,具体代码如下:

using System;
using System.Collections.Generic;
using System.Text;

namespace AdapterPattern
{
    public interface IGameModule
    {
        void Login();
        void Reset();
    }


    public abstract class MeGameModule: IGameModule
    {
        public virtual void Login()
        {
            Console.WriteLine("登陆游戏");
        }

        public virtual void Reset() {
            Console.WriteLine("重置游戏");
        }

    }
}

 接下来是实现Stream平台类,具体实现代码如下:

using System;
using System.Collections.Generic;
using System.Text;

namespace AdapterPattern
{
    public class StreamGameModule: MeGameModule
    {

        public override void Login()
        {
            //TODO Stream平台登陆游戏需要做的事情

            base.Login();
        }

        public override void Reset()
        {
            //TODO Stream平台重置游戏需要做的事情

            base.Reset();
        }


    }
}

  •  对象适配器

我们知道好的代码是结构清晰继承少用,所以对象适配器就可以解决使用继承的困扰,使用关联方式来重新实现一下Stream平台这个类吧,具体代码如下:

using System;
using System.Collections.Generic;
using System.Text;

namespace AdapterPattern
{
    public class StreamGameModule
    {
        
        public MeGameModule meGameModule;

        public StreamGameModule(MeGameModule meGameModule)
        {
            this.meGameModule = meGameModule;
        }
        
        public void Login()
        {
            //TODO Stream平台登陆游戏需要做的事情

            meGameModule.Login();
        }

        public void Reset()
        {
            //TODO Stream平台重置游戏需要做的事情

            meGameModule.Reset();
        }
    }
}

可以看到StreamGameModule由继承MeGameModule变成了持有MeGameModule对象,这种对象适配器模式遵循了多用组合少用继承。同时它还有另外一个优点,那就是被适配者的任何子类,都可以搭配着适配器使用。在这种模式里面MeGameModule也可以是一个接口。


  • 缺省适配器

当我们又需要发布到WeGame平台下,但是WeGame提供的SDK需要我们增加一个接口,比如游戏退出时需要调用的接口,直接在IGameModule上增加一个接口是没有问题的,但是有没有考虑到万一以后要发布到其他什么乱七八糟的平台,万一它们都有自己特殊的几个接口,我们都需要接入到游戏里,这样IGameModule下面不去实现的接口就会过多,这个时候缺省适配器就出现了,具体的代码如下:

public interface IWeGameModule: IGameModule
{
    void Exit();//WeGame平台专属接口
}

对于缺省适配器来说,一般是为了弥补接口过大所犯下的过错或者是弥补功能上的不足,虽然缺省适配器违背了里氏替换原则,但是缺省适配器做到了接口最小化原则。所以权衡好以后再考虑是否要使用缺省适配器。

各种适配器的特点

1)类适配器一般是针对适配目标是接口的情况下使用。

2)对象适配器有时候是为了将多个类一起适配,所以才不得不使用组合的方式,而且我们采用对象适配器的时候,可有避免使用继承。

3)缺省适配器,一般是为了弥补接口过大所犯下的过错,但是也请注意衡量利弊,权衡好以后再考虑是否要使用缺省适配器。

适配器的使用场景

1)游戏登陆接口和Stream平台登陆接口不一样,为了接口匹配。

2)当我们扩展一些SDK的功能时,也可以使用适配器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值