首页 > 其他分享 >20230426 17. 适配器模式 - NBA外籍中锋

20230426 17. 适配器模式 - NBA外籍中锋

时间:2023-06-19 09:58:01浏览次数:32  
标签:20230426 name 17 适配器 接口 void 模式 public

介绍

适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适配器模式主要解决的问题:简单地说,就是需要的东西就在面前,但却不能使用,而短时间又无法改造它,于是我们就想办法适配它

系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况

在GoF的设计模式中,对适配器模式讲了两种类型,类适配器模式和对象适配器模式,由于类适配器模式通过多重继承对一个接口与另一个接口进行匹配,而Java、C#、VB.NET等语言都不支持多重继承(C++支持),也就是一个类只有一个父类,所以我们这里主要讲的是对象适配器

适配器模式

  • Target(这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口)
  • Adaptee(需要适配的类)
  • Adapter(通过在内部包装一个Adaptee对象,把源接口转换成目标接口)

使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式

两个类所做的事情相同或相似,但是具有不同的接口时要使用它

在双方都不太容易修改的时候再使用适配器模式适配,而不是一有不同时就使用它。那有没有设计之初就需要考虑用适配器模式的时候?当然有,比如公司设计一系统时考虑使用第三方开发组件,而这个组件的接口与我们自己的系统接口是不相同的,而我们也完全没有必要为了迎合它而改动自己的接口,此时尽管是在开发的设计阶段,也是可以考虑用适配器模式来解决接口不同的问题。

如果能事先预防接口不同的问题,不匹配问题就不会发生;在有小的接口不统一问题发生时,及时重构,问题不至于扩大;只有碰到无法改变原有设计和代码的情况时,才考虑适配。事后控制不如事中控制,事中控制不如事前控制。

代码示例

Target类

@Data
public abstract class Player {
    protected String name;

    public Player(String name) {
        this.name = name;
    }

    public abstract void attack();

    public abstract void defense();
}

Target实现类

public class Forwards extends Player {
    public Forwards(String name) {
        super(name);
    }

    public void attack() {
        System.out.println("前锋 " + this.name + " 进攻");
    }

    public void defense() {
        System.out.println("前锋 " + this.name + " 防守");
    }

}

Target适配类

/**
 * 翻译者类
 *
 */
public class Translator extends Player {

    private ForeignCenter foreignCenter = new ForeignCenter();

    public Translator(String name) {
        super(name);
        foreignCenter.setName(name);
    }

    public void attack() {
        foreignCenter.进攻();
    }

    public void defense() {
        foreignCenter.防守();
    }
}

需要适配的类

/**
 * 外籍中锋
 *
 */
@Data
public class ForeignCenter {
    private String name;

    public void 进攻() {
        System.out.println("外籍中锋 " + this.name + " 进攻");
    }

    public void 防守() {
        System.out.println("外籍中锋 " + this.name + " 防守");
    }
}

客户端

public class Test {
    public static void main(String[] args) {
        Player forwards = new Forwards("巴蒂尔");
        forwards.attack();

        Player center = new Translator("姚明");
        center.attack();
        center.defense();
    }
}

标签:20230426,name,17,适配器,接口,void,模式,public
From: https://www.cnblogs.com/huangwenjie/p/17490364.html

相关文章

  • 20230426 16. 状态模式 - 工作状态
    介绍状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化State类,抽象状态类,定义一......
  • 20230426 19. 组合模式 - 分公司
    介绍组合模式(Composite),将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。Component为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为Leaf在组合中表示叶节点对象,叶节点没有子节点Composite定义......
  • 适配器模式-08
    概述适配器模式(AdapterPattern)将某个类的接口转换成客户希望的另一个接口,使接口不兼容的类也能够一起工作。又称包装器(Wrapper)。既可以作为类结构型模式,也可以作为对象结构型模式。优点:目标类和adaptee类解耦。提高了类的透明性和可复用性,灵活性和扩展性。缺点:类结构......
  • 20230426 20. 迭代器模式
    介绍迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供......
  • C++17特性
    构造函数模板推导在C++17前构造一个模板类对象需要指明类型:pair<int,double>p(1,2.2);//beforec++17C++17就不需要特殊指定,直接可以推导出类型,代码如下:pairp(1,2.2);//c++17自动推导vectorv={1,2,3};//c++17结构化绑定1.获取值//绑定tuplestd::tupl......
  • CF1778C - Flexible String 二进制枚举、状态压缩
    参考splay佬的题解写个记录https://zhuanlan.zhihu.com/p/602721281题意:给定两个字符串a,b,可以选择α里面的字符进行替换,但是替换的字符种类最多为k个。其中字符串α字符出现的种类不超过10种。求将替换后,两个字符的相同部分的数量。(相同部分指的是,指定一个区间[l,r],对应区间相......
  • 考研周记-week17
    准时的周记6.12~6.18记录一下本周的考研进度情况英语本周继续单词的复习,本周结束了数学的基础复习,并且考完了六级,目前准备开始学阅读课,并开始做早年真题,并回归正常的单词复习。数学数学方面,本周结束了基础30讲的所有学习内容,接下来讲进行概率论和线性代数的二刷,二刷结束后,就......
  • GPT-4一败涂地,语言理解的终极挑战:因果推理,17个大模型都不及格
    GPT-4一败涂地,语言理解的终极挑战:因果推理,17个大模型都不及格引言人工智能(AI)是当今科技领域最热门的话题之一,尤其是基于深度学习的自然语言处理(NLP)技术,已经在各种场景中展现出惊人的能力,比如机器翻译、文本摘要、对话系统、知识图谱等。其中,大型语言模型(LLM)是近年来最受关注的技......
  • CF1770F Koxia and Sequence
    一步都没想到,一定是状态不好吧,一定吧一定吧?加训数数!题意给定\(n,x,y\),定义好的序列\(\{a_i\}_{i=1}^n\)满足\(\sum\limits_{i=1}^na_i=x,\operatorname{OR}\limits_{i=1}^na_i=y\)。求所有好的序列的异或和的异或和。数据范围:\(1\len\le2^40,0\lex<......
  • COMP9417 - Machine Learning
    COMP9417-MachineLearningHomework1:RegularizedRegression&NumericalOptimizationIntroductionInthishomeworkwewillexploresomealgorithmsforgradientbasedoptimization.Thesealgorithmshavebeencrucialtothedevelopmentofmachinelearnin......