适配器模式

简介: 《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。目录:设计模式Github地址:DesignPattern说明定义:适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。

《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。
目录:设计模式
Github地址:DesignPattern

说明

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

UML图:

img_3d300e4667da2769837eb52c68e22925.png
适配器模式UML图.png

代码实现:

Target,这是客户所期待的接口。目标可以是具体的或者抽象的类,也可以是接口

abstract class Target{
    public void Request(){
        System.out.println("普通请求");
    }
}

adptee 需要适配的类

class Adaptee{
    public void SpecificRequest() {
        System.out.println("特殊请求");
    }
}

Adapter通过在内部包装一个Adaptee对象,把原接口转换为目标接口

class Adapter extends Target{
    private Adaptee adaptee = new Adaptee();
    
    @Override
    public void Request() {
        adaptee.SpecificRequest();
    }
}

客户端代码

public class AdapterDesign {
    
    public static void main(String[] args) {
        Target target = new Adapter();
        target.Request();
    }

}

运行结果

特殊请求

示例

例子:在NBA火箭队比赛中,教练给每个球员布置进攻和防守的任务,姚明作为外籍球员需要一个翻译。用代码模拟这个过程。

UML图:

img_261997946158101ede88cccf3105f0ca.png
适配器模式示例UML图.png

代码实现:

球员

public abstract class Player {

    protected String name;
    public Player(String name){
        this.name = name;
    }
    
    // 进攻
    public abstract void Attack();
    // 防守
    public abstract void Defense();
}

前锋,中锋,后卫代码类似

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+"防守");
        
    }
}

外籍中锋

public class ForeignCenter{

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * 外籍中锋表示只能听懂汉语拼音jingong
     */
    public void jingong() {
        System.out.println("外籍中锋"+name+"进攻");
        
    }
    /**
     * 外籍中锋表示只能听懂汉语拼音fangshou
     */
    public void fangshou() {
        System.out.println("外籍中锋"+name+"防守");
        
    }
}

翻译

public class Translator extends Player{
    
    private ForeignCenter foreignCenter = new ForeignCenter();

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

    @Override
    public void Attack() {
        foreignCenter.jingong();
        
    }

    @Override
    public void Defense() {
        foreignCenter.fangshou();
    }

}

客户端代码

public class Main {
    public static void main(String[] args) {
        Player maidi = new Forwards("麦迪");
        maidi.Attack();
        maidi.Defense();
        
        Player badier = new Forwards("巴蒂尔");
        badier.Defense();
        
        // 翻译告诉姚明,教练要你进攻和防守
        Player yaoming = new Translator("姚明");
        yaoming.Attack();
        yaoming.Defense();
    }

}

运行结果

麦迪进攻
麦迪防守
巴蒂尔防守
外籍中锋姚明进攻
外籍中锋姚明防守
目录
相关文章
|
3月前
|
Windows
|
6月前
|
设计模式 C++
结构型 适配器模式
结构型 适配器模式
39 0
|
6月前
|
设计模式
【适配器模式】—— 每天一点小知识
【适配器模式】—— 每天一点小知识
|
设计模式 Java 调度
|
Java API
适配器模式的运用
适配器模式的运用
82 0
|
设计模式 数据库 C++
2023-6-15-第六式适配器模式
2023-6-15-第六式适配器模式
92 0
|
设计模式 前端开发
关于适配器模式我所知道的
关于适配器模式我所知道的
47 0
|
Java 程序员 API
结构型模式-适配器模式
结构型模式-适配器模式
88 0
|
设计模式
我学会了,适配器模式
适配器模式属于结构型模式,这个类型的设计模式总结出了 类、对象组合后的经典结构,将类、对象的结构和使用解耦了,花式的去借用对象。
98 0
我学会了,适配器模式
|
设计模式 Java
Java设计模式 ->适配器模式
Java设计模式 ->适配器模式
120 0