Java经典编程300例之实例064 策略模式的简单应用
2014-08-01 10:03
357 查看
实例说明
在使用图像处理软件处理图片后,需要选择一种格式进行保存,然而各种格式在底层实现的算法并不相同,这刚好适合策略模式。本实例将演示如何使用策略模式与简单工厂模式组合进行实例开发。
实现过程
编写接口ImageSaver,在该接口中定义save()方法。
ImageSaver.java
再编写类GIFSaver,该类实现了ImageSaver接口。在实现save()方法时将图片保存为GIF格式。
GIFSaver.java
对于将图片保存成其他格式与存储为GIF格式类似,这里就不再赘述。
JPEGSaver.java
PNGSaver.java
再编写类TypeChooser,该类根据用户提供的图片类型来选择合适的图片存储方式。
TypeChooser.java
此处使用了简单工厂模式,根据描述图片类型的字符串创建相应的图片保存类的对象。
再编写类User,该类模拟用户的操作,为类型选择器提供图片的类型。
User.java
编译运行
$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、当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
在使用图像处理软件处理图片后,需要选择一种格式进行保存,然而各种格式在底层实现的算法并不相同,这刚好适合策略模式。本实例将演示如何使用策略模式与简单工厂模式组合进行实例开发。
实现过程
编写接口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、当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
相关文章推荐
- 大话设计模式中简单工厂模式和策略模式的商场收银软件实例的C++代码
- Java经典编程300例之实例046 单例模式的应用
- JAVA设计模式-策略模式应用实例
- JAVA设计模式-策略模式应用实例
- JAVA设计模式-策略模式应用实例
- Silverlight实用窍门系列:33.OOB模式下WebBrowser的简单应用--模拟浏览器和百度地图【附带源码实例】
- WebSphere MQ Java 应用开发简单实例(下篇:绑定模式开发)(client mode和binding mode)
- JAVA设计模式-策略模式应用实例
- JAVA设计模式-策略模式应用实例
- JAVA设计模式-策略模式应用实例
- Java策略模式的简单应用实现方法
- iOS应用运用设计模式中的Strategy策略模式的开发实例
- iOS策略模式的简单应用
- JAVA设计模式-策略模式应用实例
- Silverlight实用窍门系列:33.OOB模式下WebBrowser的简单应用--模拟浏览器和百度地图【附带源码实例】
- 策略模式在简单的商场收费软件中的应用
- 策略模式和简单工厂及反射的联合应用(待续)
- iOS应用运用设计模式中的Strategy策略模式的开发实例
- JAVA设计模式-策略模式应用实例
- JAVA设计模式-策略模式应用实例