美文网首页
第二部分·结构型模式-01-适配器模式(Adapter)

第二部分·结构型模式-01-适配器模式(Adapter)

作者: 玄德公笔记 | 来源:发表于2024-05-23 11:21 被阅读0次

1. 概念

适配器(Adapter)指将某种接口或数据结构转换为客户端期望的类型,使得不兼容的类或对象能够一起协作。

1.1 角色

目标(Target):客户端调用的目标接口
被适配者(Adaptee):已经存在且运行良好的类或对象,但它不能实现Taget接口。
适配器(Adapter):继承或管理被适配者,且可以实现目标接口。

1.2 应用场景

  • 背景
    • 已经有一个目标接口供客户端调用
    • 根据需求新增一个类(该类不能实现目标接口)
    • 修改目标接口开销会很大
  • 解决方法
    • 我们新增一个类——适配器
    • 适配器继承新增类,且可以实现目标接口
  • 结果
    • 客户端用适配器处理新增类的实例,得到的实例可以实现目标接口。

1.2 类图

image.png
classDiagram
    Target <|.. Class
    Target <|.. Adapter
    Adaptee <|-- Adapter
    Client --> Target
    class Target {
    <<interface>>
    +Service()
    }
    class Class{
   +Service()
    }
    class Adaptee{
   +AnotherService()
    }
    class Adapter{
    +*Adaptee:Adaptee
    +Service()
    }
    class Client{
    }

2. 代码示例

2.1 设计

  • 背景
    • client通过Bird接口可以获取鸟类实例的信息
    • 有一个Cat类,不能实现Bird接口
    • 但是需要client调用Bird接口来获取Cat实例的信息
  • 解决
    • 创建一个适配器CatAdapter
      • 它继承Cat类
      • 且实现Bird接口

2.2 代码

package main

import "fmt"
//之前有一个Bird接口,他可以Get鸟类的信息
type Bird interface {
    Get()
}

//比如这个鹦鹉类,实现了Bird接口
type Parrot struct {
    Name    string
    Feather string
}

func (parrot *Parrot) Get() {
    fmt.Printf("鹦鹉%q的颜色是:%q\n", parrot.Name, parrot.Feather)
}

//业务需求,多了一个猫的类
type Cat struct {
    Name string
    Fur  string
}
//它只有Show方法,不能实现Bird接口
func (cat *Cat) Show() {
    fmt.Printf("猫咪%q的颜色是:%q\n", cat.Name, cat.Fur)
}

//我们创建一个猫的解释器,他继承了猫类,同时又可以实现Bird接口
type CatAdapter struct {
    Cat *Cat
}

func (catAdapter *CatAdapter) Get() {
    catAdapter.Cat.Show()
}

//有一个客户端
type Client struct {
}
//它可以直接获取bird信息
func (client Client) GetBird(bird Bird) {
    bird.Get()
}

func main() {
    //实例化一个叫polly的鹦鹉
    polly := &Parrot{
        Name:    "polly",
        Feather: "green",
    }
    //示例话一个叫tom的猫
    tom := &Cat{
        Name: "tom",
        Fur:  "black",
    }

    client := Client{}
    //客户端可以直接使用polly
    client.GetBird(polly)
    //客户端可以通过解释器使用tom
    tomAdapter := &CatAdapter{Cat: tom}
    client.GetBird(tomAdapter)
}

2.3 示例类图

image.png
classDiagram
  Bird <|.. Parrot
  Bird <|.. CatAdapter
  Cat <|-- CatAdapter
  Client --> Bird
  class Bird {
  <<interface>>
  +Get()
  }
  class Parrot{
  +String:Name
  +String:Feather
  }
  class Cat{
  +String:Name
  +String:Fur
  +Show()
  }
  class CatAdapter{
  +*Cat:Cat
  +Get()
  }
  class Client{
  GetBird(bird Bird)
  }

相关文章

网友评论

      本文标题:第二部分·结构型模式-01-适配器模式(Adapter)

      本文链接:https://www.haomeiwen.com/subject/dljgvdtx.html