策略模式的运用
(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();
}
}
实验结果:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128197.html