前言
适配器模式从实现方式上分为三种,类适配器和对象适配器还有缺省适配器。它们区别在于实现方式和实际使用场景不同。
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的功能时,也可以使用适配器。