装饰者设计模式

一.装饰者模式

装饰者模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

二.示例1—-豆浆价格记账

现在有一个需求:

豆浆店的老板需要一个记账系统。该豆浆店的豆浆配料现有黑豆,糖等,但以后可能会有更多。

在我们设计的时候,如果值按照继承的思想,纯豆浆是父类,黑豆豆浆、加糖豆浆,黑豆加糖豆浆成为三个子类,那么如果以后新增了好多种配料呢,就会“类爆炸”了。

装饰者模式解决了这个问题,比如java io体系中,我们经常使用下面的例子:

OutputStream out = null;
        try {
            out = new FileOutputStream("xxx");
            BufferedOutputStream bos = new BufferedOutputStream(out);
            PrintStream ps = new PrintStream(bos);
            ps.println("xxx");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

声明的OutputStream有了输出流的基本功能后,通过后面的不断嵌套给流添加新的功能(装饰)。

那么,回到我们的需求,参考io流的设计写出我们的示例程序。

1.首先设计一个饮品接口(也可以设计成虚类),每个饮品都有价格和详细描述两个方法。

/**
 * 饮品接口,被装饰者的接口
 */
public interface Drink {

    float cost();          //计算价格

    String description();  //详细描述
}

2.然后设计我们的纯豆浆类,具体的被装饰者

/**
 * 具体的被装饰者类
 * 豆浆
 */
public class SoybeanMilk implements Drink {
    @Override
    public float cost() {
        return 10f;
    }

    @Override
    public String description() {
        return "纯豆浆";
    }
}

3.好了,我们现在有纯豆浆了,那么还需要配料。这里就是关键了,如何跟java 的io一样套来套去的呢,请看我们具体的装饰者类

/**
 * 针对饮品这个接口,相当于调料,基类常使用抽象类
 */
public abstract class Decorator implements Drink {

    private Drink drink;    //要装饰的对象

    public Decorator(Drink drink){
        this.drink=drink;
    }

    @Override
    public float cost() {
        return drink.cost();
    }

    @Override
    public String description() {
        return drink.description();
    }
}

可以看到,装饰者类Decorator和被装饰者类SoybeanMilk一样实现了Drink接口,但Decorator多了一个字段drink和一个构造方法,那么我们实现的时候就可以把被装饰的SoybeanMilk套到Decorator里面,然后再由Decorator的子类不断添加功能。

4.请看黑豆类

/**
 * 具体的装饰者类,黑豆豆浆
 */
public class BlackBeanDecorator extends Decorator {
    public BlackBeanDecorator(Drink drink) {
        super(drink);
    }

    @Override
    public float cost() {
        return super.cost() + 2.0f;//在纯豆浆的基础上加上黑豆的价格
    }

    @Override
    public String description() {
        return super.description() + "+黑豆";
    }
}

5.糖类

/**
 * 具体的装饰者类,糖豆浆
 */
public class SugarDecorator extends Decorator {
    public SugarDecorator(Drink drink) {
        super(drink);
    }

    @Override
    public float cost() {
        return super.cost() + 1.0f;
    }

    @Override
    public String description() {
        return super.description() + "+糖";
    }
}

6.测试

public class Test {
    public static void main(String[] args) {
        Drink drink = new SoybeanMilk();   //老板,来杯豆浆
        SugarDecorator sugarDecorator = new SugarDecorator(drink);   //老板,加点糖
        BlackBeanDecorator blackBeanDecorator = new BlackBeanDecorator(sugarDecorator);   //老板再加点黑豆

        System.out.println("你点的豆浆是:"+blackBeanDecorator.description());
        System.out.println("一共花了"+blackBeanDecorator.cost()+"元");

    }
}

7.结果:
这里写图片描述

三.示例2—-java IO体系

1.常用Io体系图
这里写图片描述
2.设计基类OutputStream(只拿字节输出流做示例)

public abstract class OutputStream implements Closeable, Flushable {
    public abstract void write(int b) throws IOException;

    public void write(byte b[]) throws IOException {
        write(b, 0, b.length);
    }

    public void write(byte b[], int off, int len) throws IOException {
        ...
    }

    public void flush() throws IOException {
    }

    public void close() throws IOException {
    }
}

3.设计输出流的子类比如FileOutputStream,作为被装饰者类,如io图所示,ObjectOutputStream,PipedOutputStream等也是具体的被装饰者类。

public class FileOutputStream extends OutputStream
{
   ....
}

4.然后就需要一个装饰者类啦,虚类FilterOutputStream,所以我们几乎没用过这个类。

public class FilterOutputStream extends OutputStream {
    /**
     * The underlying output stream to be filtered.
     */
    protected OutputStream out;

    public FilterOutputStream(OutputStream out) {
        this.out = out;
    }

    public void write(int b) throws IOException {
        out.write(b);
    }

    public void write(byte b[]) throws IOException {
        write(b, 0, b.length);
    }

    public void write(byte b[], int off, int len) throws IOException {
        if ((off | len | (b.length - (len + off)) | (off + len)) < 0)
            throw new IndexOutOfBoundsException();

        for (int i = 0; i < len; i++) {
            write(b[off + i]);
        }
    }

    public void flush() throws IOException {
        out.flush();
    }

    @SuppressWarnings("try")
    public void close() throws IOException {
        try (OutputStream ostream = out) {
            flush();
        }
    }
}

FilterOutputStream继承了OutputStream接口,实现他的方法,里面也有一个OutputStream字段。之后FilterOutputStream的子类再添加新的功能就ok了。

四.总结

设计模式能大大提高效率,这是我第一次接触设计模式,理解比较浅薄。希望以后能通过做项目加深理解。

内容概要:本文档介绍了Intel oneAPI工具集及其行业倡议,旨在提供跨架构编程解决方案,支持加速计算并打破专有锁定。oneAPI允许开发者选择最佳硬件加速技术,实现跨CPU、GPU、FPGA及其他加速器的性能优化。它兼容多种编程语言和模型(如C++、Python、SYCL、OpenMP等),并通过开放标准确保未来兼容性和代码重用。文档详细描述了oneAPI工具包的功能,包括渲染、高性能计算(HPC)、物联网(IoT)、AI分析等领域的应用。此外,还介绍了DPC++(数据并行C++)编程语言及其在不同硬件架构上的执行方式,以及Intel提供的各种优化库和分析工具,如Intel MKL、IPP、VTune Profiler等。最后,通过实际案例展示了oneAPI在医疗成像和超声产品中的成功应用。 适合人群:软件开发人员、硬件工程师、系统架构师、OEM/ODM厂商、ISV合作伙伴,特别是那些需要在多种硬件平台上进行高效编程和性能优化的专业人士。 使用场景及目标:①为跨架构编程提供统一的编程模型,简化多硬件平台的应用开发;②利用开放标准和工具集,提高代码可移植性和重用性;③通过优化编译器和技术库,提升应用程序的性能表现;④借助分析和调试工具,快速识别并解决性能瓶颈。 其他说明:Intel oneAPI工具集不仅支持现有编程语言和模型,还提供了强大的中间件和框架支持,适用于多样化的应用负载需求。开发者可以通过Intel DevCloud获取实际操作经验,同时利用DPC++兼容性工具将现有CUDA代码迁移到SYCL环境。此外,文档还提供了详细的性能优化指南和未来产品路线图,帮助用户更好地规划技术演进路径。
“班级网站设计源代码”项目是网页设计初学者及有一定基础的设计师的理想学习资源。它提供了完整的源代码,涵盖构建可运行班级网站所需的所有文件。网页设计包含前端开发、后端开发和用户体验设计等多个方面,而这个项目能帮助你深入理解这些技术的实际应用。 首先,HTML是网页的基础,它通过标签定义网页的结构,如标题、段落、图片和链接等。在这个项目中,你可以清晰地看到如何利用HTML搭建网页的框架。其次,CSS用于控制网页的样式和布局,赋予网页视觉美感。通过设置颜色、字体、布局以及响应式设计,CSS确保网站能在不同设备上良好显示。项目中的源代码展示了如何运用CSS实现多样化的样式效果。 JavaScript则是实现网页动态功能的关键,它能够处理用户交互、数据操作和动画效果。在这个班级网站中,JavaScript代码可能用于实现按钮点击事件、表单验证或页面动态更新等功能。此外,响应式设计是现代网页设计的重要组成部分。借助媒体查询和流式布局,该班级网站能够自动适应手机、平板和桌面电脑等不同设备的屏幕尺寸。 为了提高开发效率,现代网页设计常常会引入前端框架和库,如Bootstrap或Vue.js。这些工具提供了一套预设的样式和组件,简化了网页的构建过程。虽然具体是否使用了这些框架需要查看源代码,但了解它们的工作原理对于提升网页设计能力至关重要。 如果班级网站包含用户登录、留言等功能,那么后端技术(如PHP、Node.js或Python)和数据库(如MySQL或MongoDB)也会被涉及。这部分代码主要负责处理数据的提交、验证和存储,以及与服务器的通信。 用户体验(UX)和界面设计也是网页设计的重要方面。一个优秀的网站不仅要有美观的外观,还要具备良好的易用性。通过观察和分析这个班级网站的布局和交互设计,你可以学习如何提升用户体验,例如如何设计清晰的导航、易读的信息和直观的操作流程。 通过深入研究“
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值