设计模式-策略模式
策略模式的运用
(1)案例背景:
在介绍策略模式时,我们讲到了从不同角度出发,可以使用不同的出行策略的例子,教材中已经提供 了“旅游出行策略”的类图,用 Java 代码模拟实现“旅游出行策略”实例,要求使用配置文件存储具体策 略类的类名。在此基础上再增加一种新的旅游出行方式,如徒步旅行(WalkStrategy),修改原有类图及 方法,并编程实现。(教材 403 页第 1 题)
(2)实现步骤:
Ø 根据书上“旅游出行策略”类图,增加新的徒步旅行方式,画出新的类图。
- Ø 根据类图,编写并实现代码,使用 XMLUtil 类来从 XML 文件中读取相应类名。
- Ø 编译并运行代码,使代码能够模拟旅游出行策略。
(3)案例总结: 在以下情况下可以使用策略模式:
Ø 如果在一个系统里面有许多类,他们之间的区别仅在于他们的行为,使用策略模式可以动态的让 一个对象在许多行为中选择一种行为。
- Ø 一个系统需要动态的在几种算法中选择一种,那么可以将这些算法封装到一个个的具体算法类 中,而这些算法类是一个抽象算法类的子类。这些具体算法类有统一的接口,由于多态性原则, 客户端可以选择任意一个具体算法类,并只需要维持一个抽象算法类的对象。
Ø 如果一个对象有很多的行为,可以使用策略模式把这些行为转移到相应的具体策略类里面,这样 可以避免使用难以维护的多重条件选择语句。
Ø 不需要客户端直到复杂的,与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构, 提高算法的保密性和安全性
代码结构:
详细代码:
Person.java:
package Travel.Handler; import Travel.Strategy.TravelStrategy; public class Person { private TravelStrategy strategy; public void setStrategy(TravelStrategy strategy) { this.strategy = strategy; } public void travel(){ } }
TravelStrategy.java:
package Travel.Strategy; public interface TravelStrategy { public void travel(); }
AirplaneStategy.java:
package Travel.ConcreateStratery; import Travel.Strategy.TravelStrategy; public class AirplaneStategy implements TravelStrategy { public void travel(){ System.out.println("坐飞机旅游!"); } }
BicycleStrategy.java:
package Travel.ConcreateStratery; import Travel.Strategy.TravelStrategy; public class BicycleStrategy implements TravelStrategy { public void travel(){ System.out.println("骑自行车旅游!"); } }
TrainStategy.java:
package Travel.ConcreateStratery; import Travel.Strategy.TravelStrategy; public class TrainStategy implements TravelStrategy { public void travel(){ System.out.println("坐火车旅游!"); } }
WalkStategy.java:
package Travel.ConcreateStratery; import Travel.Strategy.TravelStrategy; public class WalkStategy implements TravelStrategy { public void travel(){ System.out.println("步行旅游!"); } }
XMLUtil.java:
package Travel.Utils; import org.w3c.dom.*; import javax.xml.parsers.*; import org.xml.sax.SAXException; import java.io.*; public class XMLUtil { public static Object getBean(){ try { //创建文档对象 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("src/Travel/Utils/config.xml")); //获取包含支付方式名称的文本节点 NodeList nl = doc.getElementsByTagName("className"); Node classNode=nl.item(0).getFirstChild(); String cName=classNode.getNodeValue(); //通过类名生成实例对象并将其返回 Class c=Class.forName(cName); Object obj=c.newInstance(); return obj; }catch (Exception e){ e.printStackTrace(); return null; } } }
Config.xml:
<?xml version="1.0" ?> <config> <className>Travel.ConcreateStratery.AirplaneStategy</className> </config>
Client.java:
package Travel.Client; import Travel.Utils.XMLUtil; import Travel.Handler.Person; import Travel.Strategy.TravelStrategy; public class Client { public static void main(String[] args) { System.out.println("详细设计实验报告 1904班白旭君 2019005368"); Person person = new Person(); TravelStrategy strategy ; strategy = (TravelStrategy)XMLUtil.getBean(); person.setStrategy(strategy); strategy.travel(); } }
实验结果: