千家信息网

Java中的装饰模式是什么

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,本篇内容介绍了"Java中的装饰模式是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!装饰者模式作
千家信息网最后更新 2025年01月23日Java中的装饰模式是什么

本篇内容介绍了"Java中的装饰模式是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

装饰者模式作用是针对目标方法进行增强,提供新的功能或者额外的功能,动态的扩展对象,是继承关系的一种替代方法之一,符合Java开发的开闭原则。装饰者模式和代理模式很像,可以对比帮助更好地理解学习。

我们需要通过实现接口的方式来进行增强,因此目标必须抽象为接口。

组成:

抽象组件(Component) :定义装饰方法的规范
被装饰者(ConcreteComponent) :Component的具体实现,也就是我们要装饰的具体对象。
装饰者组件(Decorator) :持有组件(Component)对象的实例引用,该类的职责就是为了装饰具体组件对象,定义的规范。
具体装饰(ConcreteDecorator) :负责给构件对象装饰附加的功能。

定义抽象接口

public interface Train {    void speed();}

定义装饰者

public class Decorator implements Train {    private Train train;    public Decorator(Train train) {        this.train = train;    }    @Override    public void speed() {        train.speed();    }}

定义具体装饰类型

第一种

public class HeXie extends Decorator {    public HeXie(Train train) {        //调用父类的有参构造        super(train);    }    public void speedUp(){        System.out.println("提速至300km/h,变身和谐号高铁");    }    @Override    public void speed(){        super.speed();        speedUp();    }}

第二种

public class FuXing extends Decorator {    public FuXing(Train train) {        //调用父类的有参构造        super(train);    }    public void speedUp(){        System.out.println("提速至350km/h,变身复兴号高铁");    }    @Override    public void speed(){        super.speed();        speedUp();    }}

定义被装饰者

public class PuKuai implements Train {    @Override    public void speed() {        System.out.println("普通列车速度100km/h");    }}

测试

public class Demo {    @Test    public void test1(){        PuKuai puKuai = new PuKuai();        Decorator decorator = new HeXie(puKuai);        decorator.speed();        System.out.println("--------------------------------------");        Decorator decorator1 = new FuXing(new HeXie(puKuai));        decorator1.speed();    }}

结果

普通列车速度100km/h提速至300km/h,变身和谐号高铁--------------------------------------普通列车速度100km/h提速至300km/h,变身和谐号高铁提速至350km/h,变身复兴号高铁Process finished with exit code 0

你可以用一个或多个具体装饰(ConcreteDecorator)包装一个对象。
装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。(类似代理模式)
装饰者模式的设计原则为:对扩展开放、对修改关闭,这句话体现在我如果想扩展被装饰者类的行为,无须修改装饰者基类,只需继承装饰者基类,实现额外的一些装饰或者叫行为即可对被装饰者进行包装。所以:扩展体现在继承、修改体现在子类中,而不是具体的抽象类,这充分体现了依赖倒置原则。

目标类可以对外提供服务,而代理模式的目标类不对外提供服务,全部由代理类完成

Java 的I/O API就是使用Decorator实现的。

抽象组件(InputStream) :装饰者模式中的超类,它只有一个抽象方法read(),子类都需要对该方法进行处理
被装饰者(FileInputStream , ByteArrayInputStream , StringBufferInputStream) :拥有通用实现read()基本方法
装饰者组件(FilterInputStream) :定义具体装饰者的行为规范,可以做统一基础处理。
具体装饰(BufferedInputStream , DataInputStream , Base64InputStream) :具体的装饰类,拥有对流的读操作做完成具体拓展能力。

"Java中的装饰模式是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0