Java中的装饰模式是什么

发布时间:2021-07-07 16:48:23 作者:chen
来源:亿速云 阅读:129

本篇内容介绍了“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中的装饰模式是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

推荐阅读:
  1. Java描述设计模式(09):装饰模式
  2. 如何使用javascript中的装饰模式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:ZooKeeper持久化原理是什么

下一篇:yii2如何使用magrate新增权限流程

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》