设计模式笔记 - 适配器模式

102 阅读1分钟

适配器模式是一种结构型设计模式,它能使接口不兼容的对象能够相互合作。


解决什么问题?

解决不同接口间不兼容问题。通过适配器模式能够对不同接口进行转换,使它们能够正常沟通。


实现步骤:

  • 定义接口
  • 实体类实现接口
  • 定义适配器类,实现接口和转换功能

优势:

  • 单一职责原则。你可以将接口或数据转换代码从程序主要业务逻辑中分离。
  • 开闭原则。 只要客户端代码通过客户端接口与适配器进行交互, 你就能在不修改现有客户端代码的情况下在程序中添加新类型的适配器

劣势:

  • 代码整体复杂度增加,因为你需要新增一系列接口和类。有时直接更改服务类使其与其他代码兼容会更简单。

下面是实现代码:

package main

import "fmt"

// 定义接口
type sendMsg interface {
	send(msg string)
}

// 实体类实现接口
type xmlClient struct{}

func (c *xmlClient) send(msg string) {
    fmt.Println("xmlClient recv: ", msg)
}

// 实体类实现接口
type jsonService struct{}

func (s *jsonService) send(msg string) {
    fmt.Println("jsonService recv: ", msg)
}

// 定义适配器类,实现接口和转换功能
type adapter struct {
	isXml2Json bool
	sm         sendMsg
}

func (a *adapter) send(msg string) {
    if a.isXml2Json {
        msg = fmt.Sprintln("xml -> json: ", msg)
    } else {
        msg = fmt.Sprintln("json -> xml: ", msg)
    }

	a.sm.send(msg)
}

func newAdapter(isXml2Json bool, sm sendMsg) *adapter {
	return &adapter{
		isXml2Json: isXml2Json,
		sm:         sm,
	}
}

func main() {
    a := newAdapter(true, &jsonService{})
    a.send("hello world")

    a = newAdapter(false, &xmlClient{})
    a.send("hello world")
}

参考: