设计模式-策略模式

策略模式的运用

(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();

    }

}

 


实验结果:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
posted @ 2022-04-23 17:22  临易  阅读(186)  评论(0编辑  收藏  举报