ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何实现图像对象的java模板方法设计模式:BufferedImage,Image,ImageIcon

2019-06-28 18:49:03  阅读:200  来源: 互联网

标签:java methods design-patterns abstract-class class


什么是图像对象的模板方法设计模式的示例,或不同类型的图像,如:BufferedImage,Image,ImageIcon.我只需要java类方法及其签名和字段,我不需要真正的功能代码.这将基于以下事实:不同类型的图像具有用于显示标题的相同机制但是用于显示图像的不同机制.

解决方法:

理论:

模板方法模式允许您在超类的方法中定义算法的骨架,即所谓的模板方法.

在此模板方法中,调用一个或多个抽象方法来完成算法的某些步骤.这种抽象方法有时被称为占位符方法.

由于它们是抽象的,因此这些步骤在超类中没有实现.相反,它们以不同的方式由子类实现,因此在特定的子类实例上调用继承的模板方法将使用它提供的占位符运行算法.

执行:

考虑使用泛型来实现更强大的模板模式,以及将占位符方法定义为受保护的,因为它们只能在模板方法中调用.

如果您不想让子类覆盖模板方法,请在抽象超类中将其声明为final.

我假设您的示例中的BufferedImage和ImageIcon都是Image的子类,并且模板方法(算法)必须显示带有其标题的图像:

// Class that defines the template method
// Generic parameter allows to define the specific type of image
// that will be handled by this image renderer
public abstract class ImageRenderer<T extends Image> {

    // This is the template method
    // It's final to avoid that subclasses override it
    public final void display(String title, T image) {
        // Display title
        this.displayTitle(title);
        // Let subclasses display specific type of image
        this.displayImage(image);
    }

    // Display title for every image type
    // This method is private since it's only called
    // from within the template method
    // (make it protected if you want to let subclasses 
    // override it, i.e. for custom title displaying)
    private void displayTitle(String title) {
        // Display title, no matter the image type
    }

    // Placeholder method, no implementation
    // Actual implementation is delegated to subclasses
    protected abstract void displayImage(T image);
}

BufferedImageRenderer类需要通过覆盖它来为displayImage()方法提供实现.这里是泛型有很大帮助的地方,因为displayImage()方法参数不需要下载:

public class BufferedImageRenderer 
    extends ImageRenderer<BufferedImage> {

    @Override
    protected void displayImage(BufferedImage image) {
        // Display specific buffered image
    }
}

相同的注意事项适用于ImageIconRenderer类:

public class ImageIconRenderer 
    extends ImageRenderer<ImageIcon> {

    @Override
    protected void displayImage(ImageIcon image) {
        // Display specific image icon
    }
}

然后,只要您需要显示特定图像及其标题,只需创建适当的渲染器并调用模板方法,即对于ImageIcon:

ImageIcon icon = getImageIconFromSomePlace();
String iconTitle = "My pretty icon";

ImageIconRenderer renderer = new ImageIconRenderer();
renderer.displayImage(iconTitle, icon);

感谢泛型,如果您尝试使用渲染器无法处理的图像调用displayImage(),您将收到一个comnpilation错误:

BufferedImage bufferedImage = getBufferedImageFromSomePlace();
String bufferedImageTitle = "My amazing buffered image";

ImageIconRenderer renderer = new ImageIconRenderer();
renderer.displayImage(bufferedImageTitle, bufferedImage); // compilation error

标签:java,methods,design-patterns,abstract-class,class
来源: https://codeday.me/bug/20190628/1318406.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有