zoukankan      html  css  js  c++  java
  • java常用设计模式(二)策略模式

      设计模式第二篇,策略模式,请大家多多指教。

    简介

      策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用该算法的客户(引自《Head First设计模式》)。举个栗子,我们可以用旅行这一行为来代入该模式,我们旅行的交通工具可以选择汽车、火车、飞机、轮船等等,这些可供选择的交通工具可以理解为算法族,他们之间是可以相互替换的,我们通过使用不同的交通工具来达到我们相同的一个目标,这就是策略模式。说了这些理论知识,让我们通过代码来具体实现该模式。

    策略模式的例子

      第一步:定义一个旅行接口TravelBehavior,有一个选择交通工具这一方法。

    public interface TravelBehavior {
    
        /** 选择交通工具 */
        void chooseVehicle();
    }

      第二步:定义n个可供选择的出行方式类,实现TravelBehavior接口

    public class AirplaneBehavior implements TravelBehavior{
        /**
         * 选择交通工具
         */
        @Override
        public void chooseVehicle() {
            System.out.println("我选择飞机");
        }
    }
    
    public class BusBehavior implements TravelBehavior{
        /**
         * 选择交通工具
         */
        @Override
        public void chooseVehicle() {
            System.out.println("我选择大巴");
        }
    }
    
    public class SteamshipBehavior implements TravelBehavior{
        /**
         * 选择交通工具
         */
        @Override
        public void chooseVehicle() {
            System.out.println("我选择轮船");
        }
    }
    
    public class TrainBehavior implements TravelBehavior{
        /**
         * 选择交通工具
         */
        @Override
        public void chooseVehicle() {
            System.out.println("我选择火车");
        }
    }
    
    public class WalkBehavior implements TravelBehavior{
    
        /**
         * 选择交通工具
         */
        @Override
        public void chooseVehicle() {
            System.out.println("我选择走路");
        }
    }

      第三步:定义一个人的类Person,有一个成员变量是旅行的行为

    public class Person {
    
        private TravelBehavior travelBehavior;
    
        public Person(TravelBehavior travelBehavior) {
            this.travelBehavior = travelBehavior;
        }
    
        public void go(){
            travelBehavior.chooseVehicle();
            System.out.println("出发");
        }
    }

      第四步:开始测试

    public class TravelTest {
    
        private static Map<String,Object> behaviorMap = new HashMap<>();
    
        static {
            behaviorMap.put("airPlain",new AirplaneBehavior());
            behaviorMap.put("bus",new BusBehavior());
            behaviorMap.put("ship",new SteamshipBehavior());
            behaviorMap.put("train",new TrainBehavior());
            behaviorMap.put("walk",new WalkBehavior());
        }
    
        public static void go(String way){
            if(StringUtils.isEmpty(way)){
               way = "walk";
            }
            Person person = new Person((TravelBehavior) behaviorMap.get(way));
            person.go();
        }
    
        public static void main(String[] args) {
            //此处模拟前台传递给后台的参数:出行方式
            String way = "";
            go(way);
        }
    
    }

    总结

      上面写了一个最简单的策略模式(我估计没有比这个更简单的了),我们来总结一下,首先人出行的方式我们抽象出来了,同理我们能够抽象出人吃饭、穿衣、工作等等一系列的行为,我们为每种行为都能定义出具体的实现。按照《head first设计模式》一书中提到的设计模式要素:算法族(旅行方式)、分别封装(各种行为的具体实现)、相互替换(做到了)。当然,写到这里这个例子的问题还有很多,比如说旅行其实不能通过单纯的行为替换来实现,应该算是一种组合行为的替换,又比如说,人应该是一种抽象,不是所有的“人”都能出行(假人就不行)等等。缺点很多,但是上面的例子应该把策略模式的思想体现出来了,望大家都能够领悟这种思想,并在实际开发中多多应用。

  • 相关阅读:
    windows下Qt5.1.0配置android环境搭建 good
    Qt Focus事件,FocusInEvent()与FocusOutEvent()
    Python框架之Django
    WITH (NOLOCK)浅析
    区域、模板页与WebAPI初步
    对象映射工具AutoMapper介绍
    .NET大型B2C开源项目nopcommerce解析——项目结构
    企业管理系统集成
    oracle中sql语句的优化
    C#可扩展编程之MEF
  • 原文地址:https://www.cnblogs.com/blue-and-white/p/11052697.html
Copyright © 2011-2022 走看看