Java经典编程300例之实例064 策略模式的简单应用

实例说明

在使用图像处理软件处理图片后,需要选择一种格式进行保存,然而各种格式在底层实现的算法并不相同,这刚好适合策略模式。本实例将演示如何使用策略模式与简单工厂模式组合进行实例开发。

 

实现过程

编写接口ImageSaver,在该接口中定义save()方法。

ImageSaver.java

public interface ImageSaver {
    void save();
}

再编写类GIFSaver,该类实现了ImageSaver接口。在实现save()方法时将图片保存为GIF格式。

GIFSaver.java

public class GIFSaver implements ImageSaver {
    @Override
    public void save() {
        System.out.println("将图片保存成GIF格式");
    }
}

对于将图片保存成其他格式与存储为GIF格式类似,这里就不再赘述。

JPEGSaver.java

public class JPEGSaver implements ImageSaver {
    @Override
    public void save() {
        System.out.println("将图片保存成JPEG格式");
    }
}

PNGSaver.java

public class PNGSaver implements ImageSaver {
    @Override
    public void save() {
        System.out.println("将图片保存成PNG格式");
    }
}

再编写类TypeChooser,该类根据用户提供的图片类型来选择合适的图片存储方式。

TypeChooser.java

public class TypeChooser {
    public static ImageSaver getSaver(String type) {
        if (type.equalsIgnoreCase("GIF")) {      //使用if...elsey语句来判断图片的类型
            return new GIFSaver();
        } else if (type.equalsIgnoreCase("JPEG")) {
            return new JPEGSaver();
        } else if (type.equalsIgnoreCase("PNG")) {
            return new PNGSaver();
        } else {
            return null;
        }
    }
}

此处使用了简单工厂模式,根据描述图片类型的字符串创建相应的图片保存类的对象。

 

再编写类User,该类模拟用户的操作,为类型选择器提供图片的类型。

User.java

public class User {
    public static void main(String[] args) {
        System.out.print("用户选择了GIF格式:");
        ImageSaver saver = TypeChooser.getSaver("GIF");
        saver.save();
        System.out.print("用户选择了JPEG格式:");
        saver = TypeChooser.getSaver("JPEG");
        saver.save();
        System.out.print("用户选择了PNG格式:");
        saver = TypeChooser.getSaver("PNG");
        saver.save();
    }
}

编译运行

$tree

.

├──GIFSaver.java

├──ImageSaver.java

├──JPEGSaver.java

├──PNGSaver.java

├──TypeChooser.java

└──User.java

$javac ImageSaver.java GIFSaver.java JPEGSaver.java PNGSaver.javaTypeChooser.java User.java

$java User

用户选择了GIF格式:将图片保存成GIF格式

用户选择了JPEG格式:将图片保存成JPEG格式

用户选择了PNG格式:将图片保存成PNG格式

 

 

技术要点

本实例应用的最重要的技术就是策略模式。对于策略模式而言,需要定义一个接口或者抽象类来表示各种策略的抽象,这样就可以使用多态来让虚拟机选择不同的实现类。然后让每一种具体的策略来实现这个接口或继承抽象类,并为其中定义的方法提供具体的实现。由于在选择适当的策略上有些不方便,需要不断地判断需要的类型,因此用简单工厂方法来实现判断过程。

 

 

策略模式(Strategy)

意图

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

适用性

1、许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。

2、需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层时,可以使用策略模式。

3、算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。

4、一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

 

 

工厂模式(Factory)

意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod 使一个类的实例化延迟到其子类。

适用性

1、当一个类不知道它所必须创建的对象的类的时候。

2、当一个类希望由它的子类来指定它所创建的对象的时候。

3、当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
100个Java经典编程实例源代码 (2 folders, 2 files, 1.38 KB, 25.13 MB in total.)          java使用编程100(二)57-100 (45 folders, 2 files, 1.38 KB, 17.04 MB in total.)             实例100 (1 folders, 4 files, 1.64 KB, 1.31 MB in total.)                  readme.txt 251 bytes          upload (2 folders, 5 files, 3.20 KB, 1.30 MB in total.)       display.jsp 841 bytes                        upload.jsp 0.98 KB               upload (0 folders, 8 files, 54.46 KB, 54.46 KB in total.)         copy.jpg 14.07 KB                              mvc2.gif 5.58 KB         st.jpg 22.26 KB         zan1.gif 1.50 KB                  样品.jpg 9.66 KB       WEB-INF (2 folders, 5 files, 4.31 KB, 1.25 MB in total.)                              struts-config.xml 1.27 KB         web.xml 1.64 KB                   classes (2 folders, 3 files, 1.39 KB, 16.66 KB in total.)                                            com (1 folders, 3 files, 1.39 KB, 13.59 KB in total.)                                               webapp (1 folders, 3 files, 1.39 KB, 12.20 KB in total.)                                                       upload (0 folders, 8 files, 10.81 KB, 10.81 KB in total.)                ApplicationResources.properties 280 bytes                                                   UploadAction.class 2.39 KB                UploadAction.java 3.22 KB                UploadForm.class 1.60 KB                UploadForm.java 1.93 KB                          resources (0 folders, 4 files, 1.67 KB, 1.67 KB in total.)             ApplicationResources.properties 280 bytes                                                   lib (0 folders, 18 files, 1.23 MB, 1.23 MB in total.)            commons-beanutils.jar 115.94 KB                           commons-collections.jar 161.25 KB            commons-digester.jar 106.54 KB            commons-fileupload.jar 21.85 KB            commons-lang.jar 62.48 KB            commons-logging.jar 30.86 KB            commons-validator.jar 45.77 KB            jakarta-oro.jar 63.84 KB                        struts-bean.tld 8.66 KB            struts-html.tld 64.64 KB            struts-logic.tld 14.17 KB            struts-nested.tld 63.14 KB            struts-template.tld 1.59 KB            struts-tiles.tld 7.67 KB            struts.jar 486.38 KB                 实例56 (1 folders, 6 files, 10.96 KB, 1.96 MB in total.)     JDBCDataMeta.class 4.59 KB             JDBCDataMeta.java 4.78 KB          readme.txt 200 bytes          lib (0 folders, 5 files, 1.95 MB, 1.95 MB in total.)        classes12.zip 1.84 MB                           mm.mysql-2.0.4-bin.jar 107.35 KB             实例57 (1 folders, 6 files, 7.01 KB, 1.96 MB in total.)     JDBCResultMeta.class 2.80 KB             JDBCResultMeta.java 2.62 KB          readme.txt 200 bytes          lib (0 folders, 5 files, 1.95 MB, 1.95 MB in total.)        classes12.zip 1.84 MB                           mm.mysql-2.0.4-bin.jar 107.35 KB             实例58 (1 folders, 6 files, 7.21 KB, 1.96 MB in total.)     JDBCSTMConn.class 2.90 KB             JDBCSTMConn.java 2.72 KB          readme.txt 200 bytes          lib (0 folders, 5 files, 1.95 MB, 1.95 MB in total.)        classes12.zip 1.84 MB           

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值