• 设计模式之适配器模式


    简单梳理适配器模式

    适配器模式实现

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

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

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

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

    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/

  • 相关阅读:
    那些惊艳一时的 CSS 属性
    基于二维切片图序列的三维立体建模MATLAB仿真
    【Minio】Linux中Docker下Minio启动提示权限不足
    OpenGL Windows 搭建环境(MFC版本)
    面试突击40:线程休眠的方法有几种?
    c++ 新的函数声明语法
    nodejs之jsdom插件,运行浏览器环境
    set和map使用讲解
    限流大法:令牌桶算法
    Python 潮流周刊第 13 期(2023-07-29)
  • 原文地址:https://blog.csdn.net/ForeverLucky_/article/details/128196810