精华内容
下载资源
问答
  • 装饰器和适配器的区别
    2020-10-17 16:35:44
    装饰器是动态的添加方法,装饰者和被装饰者具有层次关系,但是对使用者是无感的,相当于是同一个接口;
    适配者是把一个接口变为另一个接口,已达成适配效果,适配者和被适配者没有层次关系,对开发者无感的。
    
    更多相关内容
  • 适配器模式和装饰器模式都可以在原类文件方法的基础上修改、增强,但侧重点不一样

    适配器模式和装饰器模式都可以在原类文件方法的基础上修改、增强,但侧重点不一样,
    适配器模式重在将一个接口转换为另一个接口
    装饰器模式侧重对原类文件方法的增强,但接口还是同一个接口

    适配器模式:

    适配器模式:解决原类文件(适配者)和现有需求(目标)相似但不能直接使用的情况。
    通过加一层适配器,对现有接口进行增强,用户在使用适配器时无需知道适配器内部的工作细节,
    所以适配器类内部可以直接组合现有接口(也就是适配者),
    适配者的在适配器中的调用对于用户是无感的,用户只需要关心适配器即可

    装饰器模式:

    装饰器模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能,通过创建一个包装对象,也就是装饰来包裹真实的对象。
    因为装饰器只是增强了原类文件的功能,所以装饰器类和原类文件的接口应该是一样的,在装饰器模式中采用了接口来规范二者的方法,保证方法的一致性【在适配器模式中不需要保证适配器和适配者接口一致】
    用户在使用原类文件时可以有选择的对此类进行装饰(即装饰和不装饰),所以用户对原类文件的存在是有感知的,使用聚合的方式传入要装饰的原类对象。
    当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

    展开全文
  • 装饰器模式 装饰器模式(Decorator )允许向一个现有的对象添加新的增强功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 一般的,我们为了扩展一个类经常使用继承方式...

    装饰器模式

    装饰器模式(Decorator )允许向一个现有的对象添加新的增强功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装

    一般的,我们为了扩展一个类经常使用继承方式实现,但随着扩展功能的增多,子类会很膨胀。在不想增加很多子类的情况下扩展类。这个时候就可以通过装饰器模式动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。但缺点就是多层装饰比较复杂。

    那它是怎么实现的呢?
    通过先将具体功能职责划分好,对于每部分功能职责,都有一个实现了原始类接口的装饰器类,装饰器类可以有继承它的子类来添加额外的职责。装饰模式是直接继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

    举例实现:

    我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。

    RedShapeDecorator 是实现了 ShapeDecorator 的实体类。DecoratorPatternDemo 类使用 RedShapeDecorator 来装饰 Shape 对象。

    在这里插入图片描述具体代码实现步骤:菜鸟教程:装饰器模式

    装饰器模式最经典的应用:Java IO 类

    Java IO 类库非常庞大和复杂,负责 IO 数据的读取和写入。如果对 Java IO类做一下分类,我们可以从下面两个维度将它划分为四类。具体如下所示:
    在这里插入图片描述
    针对不同的读取和写入场景,Java IO 又在这四个父类基础之上,扩展出了很多子类。
    在这里插入图片描述
    由于IO库中需要很多性能的各种组合,如果用继承方法实现,那么每一种组合都需要一个类,这样会造成大量性能重复的类出现。如果使用装饰器模式,那么类的数目大大减少,性能的重复也减到最少。因此装饰器模式是IO中的基本模式。

    适配器模式

    适配器模式(Adapter)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
    这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

    怎么实现的呢?
    这是通过继承和依赖关系(这里具体指组合)实现的,适配器继承或依赖已有的对象,实现想要的目标接口。

    举例实现:
    有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer。默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件。
    我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。该类可以播放 vlc 和 mp4 格式的文件。
    我们想要让 AudioPlayer 播放其他格式的音频文件。为了实现这个功能,我们需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。
    AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。AdapterPatternDemo 类使用 AudioPlayer 类来播放各种格式。

    在这里插入图片描述
    具体代码实现步骤:菜鸟教程:适配器模式

    适配器模式有两种实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。上面案例中的适配器类就是个使用组合关系实现的对象适配器。MediaAdapter类和AdvancedMediaPlayer 类是组合关系,如果是继承关系,那就是类适配器了。

    适配器模式应用场景有

    1. 封装有缺陷的接口设计;
    2. 统一多个类的接口设计;
      某个功能的实现依赖多个外部系统(或者说类)
    3. 替换依赖的外部系统;
      当我们把项目中依赖的一个外部系统替换为另一个外部系统的时候,利用适配器模式,可以
      减少对代码的改动。
    4. 兼容老版本接口;
    5. 适配不同格式的数据;

    适配器模式比较常见的应用: Java 日志

    Java 中有很多日志框架,在项目开发中,我们常常用它们来打印日志信息。其中,比较常用的有 log4j、logback,以及 JDK 提供的 JUL(java.util.logging) 和 Apache 的JCL(Jakarta Commons Logging) 等。

    大部分日志框架都提供了相似的功能,但它们却并没有实现统一的接口。
    如果我们开发的是一个集成到其他系统的组件、框架、类库等,那日志框架的选择就没那么随意了。如果引入多个组件,每个组件使用的日志框架都不一样,那日志本身的管理工作就变得非常复杂。所以,为了解决这个问题,我们需要统一日志打印框架。

    对于java开发者, Slf4j 这个日志框架你肯定不陌生,它相当于 JDBC 规范,提供了一套打印日志的统一接口规范。不过,它只定义了接口,并没有提供具体的实现,需要配合其他日志框架(log4j、logback……)来使用。而且它不仅仅提供了统一的接口定义,还提供了针对不同日志框架的适配器。对不同日志框架的接口进行二次封装,适配成统一的 Slf4j 接口定义。
    并且Slf4j 不仅仅提供了从其他日志框架到 Slf4j 的适配器,还提供了反向适配器,也就是从 Slf4j 到其他日志框架的适配。

    代理、装饰器、适配器 这3 种设计模式的特点和区别

    代理模式:代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它跟装饰器模式最大的不同。

    装饰器模式:装饰者模式在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的嵌套使用。

    适配器模式:适配器模式是一种事后的补救策略。适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口。

    展开全文
  • 一、装饰器模式 特点: 在不改变一个对象本身功能的基础上给对象增加新的功能,即功能增强; 如Java IO中的BufferedReader类就是对InputStreamReader类的包装或增强。 BufferedReader br = new BufferedReader...

    目录

    一、装饰器模式

    二、适配器模式

    1、类适配器

    2、对象适配器

    3、适配器模式的优缺点


    一、装饰器模式

    特点:

    • 在不改变一个对象本身功能的基础上给对象增加新的功能,即功能增强;
    • 如Java IO中的BufferedReader类就是对InputStreamReader类的包装或增强。
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    举例:

     

    假如xx去4S店买了一款领克01,它拥有领克车系的所有基础功能,但01却没有LED大灯,因此花点钱可以加装一个。

     

    Demo实现:

    /**汽车接口(抽象角色) */
    public interface Car {
        void getCarInfo();
    }
    
    /** 领克01车型(具体角色) */
    public class LynkCar implements Car{
        @Override
        public void getCarInfo() {
            System.out.println("领克车子的基本功能都有了~~~");
        }
    }
    
    /**加装LED大灯(装饰角色) */
    public class LynkCarDecorate implements Car {
        // 通过构造器注入
        private LynkCar lynkCar;
    
        public LynkCarDecorate(LynkCar lynkCar) {
            this.lynkCar = lynkCar;
        }
    
        // 加装LED大灯方法
        public void addLedBulb() {
            System.out.println("OK,已加装LED大灯");
        }
    
        // 增强原汽车的功能
        @Override
        public void getCarInfo() {
            System.out.println("给领克车子加个LED大灯吧~~~");
            this.addLedBulb();
        }
    }

    测试:

    @Test
    void testDecorate() {
        // 没有装饰器
    //    LynkCar lynkCar = new LynkCar();
    //    lynkCar.getCarInfo();
        // 有装饰器
        LynkCarDecorate lynkCarDecorate = new LynkCarDecorate(new LynkCar());
        lynkCarDecorate.getCarInfo();
    }

    结果:

    二、适配器模式

    特点:

    • 将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,像插座转换器、USB转VGA的转接头,220V交流电转5V直流电等都属于生活中的适配器;
    • 适配器(Adapter)有三种类型:类适配器模式(通过继承特性来实现适配器的功能)、对象适配器模式(通过对象组合方式来实现适配器的功能)、接口适配器模式(借助抽象类来实现适配器的功能);
    • 适配器模式也是一种包装模式,具有包装的功能,实际中建议尽量使用对象的适配器模式。

    1、类适配器

    通过继承方式来实现适配器的功能。

    举例:

    不同品牌的手机充电接口是不同的,像苹果和华为分别采用的是苹果USB,type-c,为了在充电时满足不同品牌手机的需求,通过一个一线三拖的数据线可以解决这个问题,而这个一线三拖的数据线就是适配器角色。

    Demo实现:

    /** 苹果手机用苹果数据线 (被适配者)*/
    class AppleUSB {
        public void connection() {
            System.out.println("使用苹果手机数据线连接...");
        }
    }
    
    /** 定义目标接口,有数据线连接的功能 */
    interface Target {
        void connection();
    }
    
    /** 华为手机是type-c数据线 */
    class HuaWeiUSB implements Target {
        @Override
        public void connection() {
            System.out.println("使用华为手机type-c数据线连接...");
        }
    }
    
    /** 开发一个一线三拖的数据线(适配器类),继承了被适配类,同时实现标准接口,实现不同USB都能使用 */
    class OneToThreeAdapter extends AppleUSB implements Target {
    
        @Override
        public void connection() {
            System.out.println("插入一线三拖数据线.....");
            super.connection();
        }
    }

    测试:

    @Test
    void testAdapter() {
        Target target = new HuaWeiUSB();
        target.connection();
    
        Target adapter = new OneToThreeAdapter();
        adapter.connection();
    }
    // 结果如下:
    使用华为手机type-c数据线连接...
    插入一线三拖数据线.....
    使用苹果手机数据线连接...

    2、对象适配器

    对象适配器与类适配器不同之处在于,类适配器通过继承来完成适配,对象适配器则是通过对象关联来完成。改造上面的oneToThreeAdapter 类,只去实现接口,并将被适配者(苹果USB)作为该适配器的成员属性即可。

    /** 一线三拖的数据线 */
    class OneToThreeAdapter implements Target {
        // 将被适配者作为成员属性
        private AppleUSB apple = new AppleUSB();
        
        @Override
        public void connection() {
            System.out.println("插入一线三拖数据线.....");
            apple.connection();
        }
    }

    3、适配器模式的优缺点

    总结下适配器模式的优点:

    • 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构;
    • 增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用;
    • 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”

    当然,它也是有缺点的:

    • Java是单继承机制,类适配器模式中,一次最多只能适配一个适配者类;
    • 对象适配器模式中,在适配器中置换适配者类的某些方法比较麻烦。
    展开全文
  • 对比代理、桥接、装饰器适配器 4 种设计模式,从 模式结构与角色、模式定义与意图、模式区别这几个角度
  • 适配器模式与装饰器模式的区别

    万次阅读 多人点赞 2018-04-09 22:38:25
    适配器模式 对适配器模式的功能很好理解,就是把一个类的接口变换成客户端所能接受的另一种接口,从而使两个接口不匹配而无法在一起工作的两个类能够在一起工作。 适配器模式的结构: target(目标接口):所要...
  • 装饰器适配器模式 在Java语言 I/O库的设计中,使用了两个结构模式,即装饰模式和适配器模式。 在任何一种计算机语言中,输入/输出都是一个很重要的部分。与一般的计算机语言相比,Java将输入/输出的功能使用范畴...
  • 装饰器和适配器模式

    2020-12-08 11:28:30
    适配器模式与装饰器模式的区别 装饰器适配器都有一个别名叫做 包装模式(Wrapper),它们看似都是起到包装一个类或对象的作用,但是使用它们的目的很不一一样。适配器模式的意义是要将一个接口转变成另一个接口,它...
  • 适配器模式 装饰器模式 的 区别

    千次阅读 2020-12-26 18:56:23
    适配器: 笔记本电脑屏幕小要外接显示器,但是只有HDMI接口,而基地的显示器比较旧,用的是VGA...装饰器模式: 低端的电视机只能遥控操作,高端的电视机还可以触屏。 结果:高端电视机能触屏还保留了遥控功能 ...
  • 装饰器模式 代理模式: 适配器模式 什么是是适配器模式呢?他的作用是什么呢? 适配器模式,就是当老的接口已经不支持新的业务逻辑时,需要定义一个新的接口,实现新的业务,关键:老接口的实现类也能实现新...
  • 参考:http://my.oschina.net/gao0516/blog/136103装饰器模式:是在不必改变原类文件使用继承的情况下,动态的扩展一个对象的功能适配器模式:将一个类的接口转换成客户希望的另外一个接口直接上代码分析:...
  • 适配器模式适配器模式,就是把一个类的接口变换成客户端所能接受的另一个接口,从而使两个接口不匹配的两个类能够在一起工作。 通常用于一个项目需要引用一些开源框架来一起工作的情况下,这些开源框架都有一些关于...
  • 装饰者模式: 装饰者模式(Decorator Pattern)是指在不改变原有对象的基础之上,将功能附加到对 象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。 1、用于扩展一个类的功能或给一个...
  • 装饰模式与适配器模式的的区别

    千次阅读 2018-07-30 19:32:38
    做java也两年多的时间了,java入门不久就买了一本阎宏的《java与模式》研究,那时看模式简直就像看天书一样,特别是装饰模式和适配器模式,于是就束之高阁了。 工作之后,在项目中也经常用到模式,体会到模式的好处...
  • 适配器模式 装饰器模式 代理模式的区别
  • 1装饰器模式 定义:装饰模式是在不必改变原类文件不使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 2配适器模式
  • 适配器:没有成绩关系,装饰器模式有层级关系 定义: 装饰者:装饰者被装饰者都实现同一个接口,主要目的是为了扩展之后依旧保留OOP关系 适配器适配器和被适配者没有必然的联系,通常是采用继承或代理的...
  • 代理、桥接、装饰器适配器,这 4 种模式是比较常用的结构型设计模式。它们的代码结构非常相似。笼统来说,它们都可以称为 Wrapper 模式,也就是通过 Wrapper 类二次封装原始类。 尽管代码结构相似,但这 4 种设计...
  • 装饰器模式 顾名思义,就是对已经存在的...他与代理模式的区别就是装饰器模式是is-a关系,而代理模式不一定是。例子这里就不举了 适配器模式 适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二...
  • 装饰模式的使用 装饰模式:动态的为对象增加新的功能,用于代替继承,避免类型体系的快速膨胀(熟悉代码规则的应该都知道,类往上追溯父类,层级不能超过5)。 装饰模式的组成: 1. Component:组件接口 2. ...
  • 设计模式-装饰器模式:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
  • 一、装饰器: 对原有功能进行扩展,是其原有功能能力得到增强。 当然对原有功能进行增强的方式除了是用适配器模式外,通过继承的方式也是对其他类的功能进行增强。 主要角色有:待装饰抽象类、待装饰类、装饰...
  • 设计模式之代理模式、装饰模式、适配器模式详解以及C++案例。
  • 装饰器模式 适配器模式 区别适配器模式是将一个类A装换成另一个类B。类A类B的接口不同 装饰着模式是为一个类A增添新的功能,从而变成类B。类A类B的接口相同,在构造器中传递对象参数...
  • 一、工厂模式 ...工厂模式的设计原则验证,构造函数创建者分离,符合开放封闭原则。 工厂模式的代码,如下所示: class Product { constructor(name) { this.name = name } init() { alert

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,049
精华内容 16,819
关键字:

装饰器和适配器的区别