如何为图像 objects 实现 java 模板方法设计模式:BufferedImage、Image、ImageIcon

How to implement java template method design pattern for image objects: BufferedImage, Image, ImageIcon

图像 objects 的 template method design pattern 或不同类型的图像的示例是什么:BufferedImageImageImageIcon。我只需要 java class 方法及其签名和字段我不需要真正的功能代码。这是基于这样一个事实,即不同类型的图像具有相同的标题显示机制,但显示图像的机制不同。

模板方法模式是一种行为设计模式,它在方法中定义算法的程序框架。

Smalltalk 的 printString 是一个模板方法。

我想 java 中有一个 draw(Graphics g) 方法,它也是一个模板方法。

对于您的情况,您也可以在父 class 中使用以下绘图模板方法。实现此方法的子 classes 可以定义自己的算法来绘制图像

public void draw(Image i);

例子

   class Image {
        int x1,y1,x2,y2; // may be boundaries of image common to all inherited 
objects
        String title;

        protected void displayTitle() {

        }
        // some code goes here
        public void draw() {
             // some code common to all image drawing
             // this might involve x and y declared above
             displayTitle();
             drawImage();
             // some more code after the template method
        }
        // the subclasses inheriting define their own algorithm to display image
        public abstract void drawImage();
    }

    class BufferedImage extends Image {
        // defines its own algorithm    
        public void drawImage() {
            // BufferedImage specific code to display the image
        }
    }

    class IconImage extends Image {
        // defines its own algorithm
        public void drawImage() {
            // IconImage specific code to display the image
        }
    }

    class DriverProgram {
        public static void main(String[] args) {
            Image[] image = {new BufferedImage(),new IconImage(),new XYXImage()};
            for(Image img:image) {
                img.draw();  // calling the template method
            }
        }
    }

正如我上面所说,模板方法定义了子classes 应该实现的算法框架。它是一种美丽的设计模式。

在软件工程中,模板方法模式是一种行为设计模式,将算法的程序骨架定义在一个方法中,称为模板方法,将一些步骤推迟到subclasses。它允许人们在不改变算法结构的情况下重新定义算法的某些步骤。

首先你需要声明一个抽象class,它将被其他图像class继承。 它声明了一个抽象方法,旨在由其他 classes 实现 以及一种将由实现此抽象 class:

的 classes 继承的方法
public abstract class Template{    
    public String imageTitle;
    abstract public void displayImage(JLabel label); //abstract unimplemented method
    public void displayTitle(String imageTitle)
    {
        //Implement your display title method for all classes
    }       
}

然后你可以定义你的classes来实现抽象方法:

public class ImageIconClass extends Template{
    @Override
    public void displayImage(JLabel label) {
        // Implement specific display image method for ImageIconClass       
    }
}

public class ImageClass extends Template{
    @Override
    public void displayImage(JLabel label) {
         // Implement specific display image method for ImageClass          
    }
}

public class BufferedImageClass extends Template{
     @Override
    public void displayImage(JLabel label) {
       // Implement specific display image method for BufferedImageClass        
    }    
}

Jlabel是用来显示图片的。

理论:

模板方法模式让您在超class、so-called 模板方法 的方法中定义算法的骨架。

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

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

实施:

考虑使用 generics 来实现更强大的模板模式,并将占位符方法定义为 protected,因为它们旨在被调用只能从模板方法中。

如果不想让subclasses重写模板方法,在抽象superclass.

中声明为final

我假设您示例中的 BufferedImageImageIcon 都是 Image 的子class 并且模板方法(算法)必须显示图像标题为:

// 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);
}

class BufferedImageRenderer 需要通过重写 displayImage() 方法来实现它。这是泛型有很大帮助的地方,因为 displayImage() 方法参数不需要 downcasted:

public class BufferedImageRenderer 
    extends ImageRenderer<BufferedImage> {

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

同样的考虑也适用于 ImageIconRenderer class:

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(),您将收到编译错误:

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

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