首页 > 其他分享 >适配器模式

适配器模式

时间:2023-08-06 17:06:40浏览次数:37  
标签:turkey 火鸡 适配器 接口 模式 野生 void

适配器模式

**适配器模式:**将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

介绍

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

**主要解决:**主要解决在软件系统中,常常要将一些”现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的。

何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

**如何解决:**继承或依赖(推荐)。

**关键代码:**适配器继承或依赖已有的对象,实现想要的目标接口。

应用实例: 1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。 2、JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。 3、在 LINUX 上运行 WINDOWS 程序。 4、JAVA 中的 jdbc。

优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。

缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

**使用场景:**有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

**注意事项:**适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

实现

package HeadFirstDesignMode.adapter;

/**
 * 描述:适配器模式
 */
public class AdapterPattern {

    public static void main(String[] args) {
        MallardDuck duck = new MallardDuck();//鸭子
        WildTurkey turkey = new WildTurkey();//火鸡
        Duck turkeyAdapter = new TurkeyAdapter(turkey);

        System.out.println("鸭子。。。");
        testDuck(duck);

        System.out.println("\n火鸡。。。");
        turkey.gobble();
        turkey.fly();

        System.out.println("\nturkeyAdapter。。。");
        testDuck(turkeyAdapter);
    }

    static void testDuck(Duck duck) {
        duck.quack();
        duck.fly();
    }

}

interface Duck{
    void quack();
    void fly();
}

class MallardDuck implements Duck {

    @Override
    public void quack() {
        System.out.println("野生鸭子呱呱叫~");
    }

    @Override
    public void fly() {
        System.out.println("野生鸭子会飞行~");
    }
}

interface Turkey{
    void gobble();
    void fly();
}

class WildTurkey implements Turkey {
    @Override
    public void gobble() {
        System.out.println("野生火鸡咯咯叫~");
    }

    @Override
    public void fly() {
        System.out.println("野生火鸡短途飞行~");
    }
}

class TurkeyAdapter implements Duck {
    Turkey turkey;

    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }

    @Override
    public void quack() {
        turkey.gobble();
    }

    @Override
    public void fly() {
        for (int i = 0; i < 5; i++) turkey.fly();
    }
}

执行程序,输出结果:

鸭子。。。
野生鸭子呱呱叫~
野生鸭子会飞行~

火鸡。。。
野生火鸡咯咯叫~
野生火鸡短途飞行~

turkeyAdapter。。。
野生火鸡咯咯叫~
野生火鸡短途飞行~
野生火鸡短途飞行~
野生火鸡短途飞行~
野生火鸡短途飞行~
野生火鸡短途飞行~

标签:turkey,火鸡,适配器,接口,模式,野生,void
From: https://blog.51cto.com/u_11906056/6985086

相关文章

  • 外观模式
    **外观模式:**提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。外观模式(FacadePattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复......
  • 模板方法模式
    **模板方法模式:**在一个方法中定义一个算法的骨架,现将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。在模板模式(TemplatePattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象......
  • 常见的电商模式 B2B、B2B、C2B、C2C、O2O
    1电商模式市面上有5种常见的电商模式B2B、B2B、C2B、C2C、O2O1.1B2B模式B2B(BusinesstoBusiness),是指商家和商家建立的商业关系,如阿里,1.2B2C模式B2C(BusinesstoConsumer)就是我们经常看到的供应商直接把商品买个用户,即“商对客”模式,也就是我们呢说的商业零售......
  • 策略模式
    IfyoucanNOTexplainitsimply,youdoNOTunderstanditwellenough**介绍:**定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户**主要解决:**在有多种算法相似的情况下,使用if…else所带来的复杂和难以维护。**何时使用:**一个系......
  • 观察者模式
    **介绍:**定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖都会收到通知并自动更新。**主要解决:**一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。**何时使用:**一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得......
  • 装饰者模式
    装饰者模式**装饰者模式:**动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。*设计原则:*类应该对扩展开放,对修改关闭继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式。在我们的设计中,应该允许行为可以被扩展,而无须修改现有的代码。组合和......
  • 工厂方法模式
    工厂方法模式**工厂方法模式:**定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。设计原则:依赖倒置原则:要依赖抽象,不要依赖具体类。下面的指导方针,能避免在OO设计原则中违反依赖倒置原则:变量不可以持有具体的类的引用。不要让......
  • 【Java】智慧工地管理系统源码(SaaS模式)
    智慧工地是聚焦工程施工现场,紧紧围绕人、机、料、法、环等关键要素,综合运用物联网、云计算、大数据、移动计算和智能设备等软硬件信息技术,与施工生产过程相融合。一、什么是智慧工地智慧工地是指利用移动互联、物联网、智能算法、地理信息系统、大数据挖掘分析等信息技术,提高项目......
  • openGauss学习笔记-32 openGauss 高级数据管理-批处理模式
    openGauss学习笔记-32openGauss高级数据管理-批处理模式openGauss支持从文本文件执行SQL语句。openGauss提供了gsql工具实现SQL语句的批量处理。以下场景建议使用批处理:如果您重复运行查询(例如,每天或每周),将其设为脚本可以让您避免每次进行重复输入。您可以通过复制和编辑脚......
  • C++工厂模式简易实现
    C++工厂模式简易实现引言:动态绑定是面向对象编程的重要功能,但C++目前还没有纳入标准库的反射机制,所以为了更方便的动态构造对象,使得通过配置文件的方式改变派生类对象,而不需要去修改代码,所以可以使用工厂这一常见的设计模式,来完成类对象的动态构造。基于C++11的新特性和模板,实现......