如何为图像 objects 实现 java 模板方法设计模式:BufferedImage、Image、ImageIcon
How to implement java template method design pattern for image objects: BufferedImage, Image, ImageIcon
图像 objects 的 template method design pattern
或不同类型的图像的示例是什么:BufferedImage
、Image
、ImageIcon
。我只需要 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
我假设您示例中的 BufferedImage
和 ImageIcon
都是 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
图像 objects 的 template method design pattern
或不同类型的图像的示例是什么:BufferedImage
、Image
、ImageIcon
。我只需要 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
我假设您示例中的 BufferedImage
和 ImageIcon
都是 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