设计模式-策略模式

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 设计模式-策略模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

策略模式的运用

(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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!