• 设计模式之适配器模式


    简单梳理适配器模式

    适配器模式实现

    我们看篮球的时候,经常看到前锋中锋后卫针对球场形式进行进攻或防守。

    但是对于需要翻译的外籍球员,就需要配备一个翻译员才能听懂教练的战术。

    我们看下这个场景下,用适配器模式如何实现。

    首先我们定义基本类,球员基类。

    public abstract class Player {
        protected String name;
    
        public Player(String name) {
            this.name = name;
        }
    
        public abstract void Attack();
        public abstract void Defense();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    定义对应的前锋、中锋、后卫类

    前锋

    public class Forwards extends Player{
        public Forwards(String name) {
            super(name);
        }
    
        @Override
        public void Attack() {
            System.out.println("前锋("+name+")进攻");
        }
    
        @Override
        public void Defense() {
            System.out.println("前锋("+name+")防守");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    中锋

    public class Center extends Player{
        public Center(String name) {
            super(name);
        }
    
        @Override
        public void Attack() {
            System.out.println("中锋("+name+")进攻");
        }
    
        @Override
        public void Defense() {
            System.out.println("中锋("+name+")防守");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    后卫

    public class Guards extends Player{
        public Guards(String name) {
            super(name);
        }
    
        @Override
        public void Attack() {
            System.out.println("后卫("+name+")进攻");
        }
    
        @Override
        public void Defense() {
            System.out.println("后卫("+name+")防守");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    外籍中锋

    public class ForeignCenter {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void Attack() {
            System.out.println("外籍中锋("+name+")进攻");
        }
    
        public void Defense() {
            System.out.println("外籍中锋("+name+")防守");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    再为外籍中锋配备一个翻译类,同样继承自Player基类

    public class Translator extends Player{
        private ForeignCenter wjzf = new ForeignCenter();
    
        public Translator(String name) {
            super(name);
            wjzf.setName(name);
        }
    
        @Override
        public void Attack() {
            wjzf.Attack();
        }
    
        @Override
        public void Defense() {
            wjzf.Defense();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这样我们前期的定义就算做完了,
    然后我们看具体应用中的使用。

    定义业务方法

    看在具体业务逻辑中如何使用

    public class AdapterTest {
        public static void main(String[] args) {
            //适配器模式
            func1();
        }
    
        public static void func1(){
            Player a = new Forwards("麦迪");
            a.Attack();
    
            Player b = new Center("乔丹");
            b.Attack();
    
            Player c = new Guards("艾弗森");
            c.Defense();
    
            Player d = new Translator("姚明");
            d.Attack();
            d.Defense();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    执行结果

    前锋(麦迪)进攻
    中锋(乔丹)进攻
    后卫(艾弗森)防守
    外籍中锋(姚明)进攻
    外籍中锋(姚明)防守
    
    • 1
    • 2
    • 3
    • 4
    • 5

    结果分析

    适配器模式,将一个类的接口,转换为客户想要的另一个类的接口。
    适配器模式使得原本不兼容的接口可以一起工作。
    
    那什么时候该考虑使用适配器模式呢?
    在我们想使用一个已经存在的类,但由于接口也就是它的方法和你的要求不一致时,
    就该考虑使用适配器模式了。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    https://xmlrambo.github.io/
    https://xmlrambo.gitee.io/

  • 相关阅读:
    代码随想录训练营第36天|LeetCode 435. 无重叠区间、763.划分字母区间、 56. 合并区间
    Skype与Teams的混合部署--意义,效果,注意事项以及建议
    Hproxy项目前端
    【Python从入门到进阶】58、Pandas库中Series对象的操作(一)
    金仓数据库 KingbaseES插件参考手册 B
    C++ 内存管理 基本部分
    Python面向对象编程
    User CSS 在性能优化方面的实践
    【Dubbo3高级特性】「框架与服务」服务并发控制及集群负载均衡的实践指南(含扩展SPI)
    基于C++的朴素贝叶斯分类器
  • 原文地址:https://blog.csdn.net/ForeverLucky_/article/details/128196810