zoukankan      html  css  js  c++  java
  • Java设计模式——策略模式

    前言

      如果此前你已经阅读过《Head First 设计模式》这本书,那么你现在可以跳过本文的阅读。当然,如果你想温故而知新,非常欢迎。本文使用的实例并非是基于《Head First 设计模式》这本书上的内容。


    概述

      策略模式其实是为了解决,针对同一个问题有多个不能的解决方式,也就是说提供了多种不同的解决策略。比如,我们对一个数组进行排序。那么这里就有冒泡排序、快速排序、归并排序等等不同的算法,这里我们就可以说这些是不同的策略。可以把这些不同的排序算法设计成策略模式。


    本文链接:http://blog.csdn.net/lemon_tree12138/article/details/45894511 -- Q-WHai
                                                                     --转载请注明出处


    思路分析

      如果我们没有策略模式的话,当我们想要使用不同算法来解决同一个问题的时候,势必要去创建不同的算法对象。然后再对各个不同的对象进行处理。这样来做,当然OK。不过我们还是最好使用本文的策略模式来封装。

      关于策略模式的类图,可以下面的图-1.


    图-1 策略模式类图

      看到策略模式的类图,我们知道不同的策略都是实现了同一个接口,然后再重写接口中的方法。现在,我们已经有了类图。


    实例及说明

    说明:

      上面说到策略模式是针对解决同一个问题的不同解法而设计的。那么,我们现在就举个栗子来看看。

      现在假设,我们要做一件事:格式化一个时间点。给你一个用秒数表示的时间,现在要用不同的展示方式显示格式化后的表示。实现的类图可以参考上面的图-1。


    代码及步骤:

    1.公共接口

      根据类图,我们首先要有一个接口,并提供一个格式化时间的方法。

    public interface FormatTime {
    
        public String format(long millis);
    }

    2.具体策略

      再来看看接口的实现,即具体的策略类。

    public class FormatWithChinese implements FormatTime {
    
        @Override
        public String format(long millis) {
            int s = (int) (millis / 1000);
    
            int h = s / (60 * 60);
            s = s % (60 * 60);
    
            int m = s / 60;
            s = s % 60;
    
            return StringUtils.formatIntegerString(h, "#00") + "时"
                    + StringUtils.formatIntegerString(m, "#00") + "分"
                    + StringUtils.formatIntegerString(s, "#00") + "秒";
        }
    }

    3.再次封装

      到了这里,我们的客户其实就已经可以通过上的接口来操作不同的策略了。不过,这里我最好还是封装一层。
    public class StrategyContains {
    
        private FormatTime formatTime;
        
        public StrategyContains(FormatTime _formatTime) {
            this.formatTime = _formatTime;
        }
        
        public String format(long millis) {
            return formatTime.format(millis);
        }
    }

    4.客户端测试

      客户端的测试方法也很简单。具体如下:

    public class FormatTimeClient {
    
        public static void main(String[] args) {
            StrategyContains strategy = new StrategyContains(new FormatWithColon());
            System.out.println(strategy.format(155796986));
        }
    }

    GitHub源码下载

    https://github.com/William-Hai/DesignPatternCollections


  • 相关阅读:
    知物由学 | 未来安全隐患:AI的软肋——故意欺骗神经网络
    IT和非IT人士:2分钟了解什么是区块链
    追踪掠食者:地下灰产如何撸死创业公司?
    机器学习、深度学习、和AI算法可以在网络安全中做什么?
    一文了解安卓APP逆向分析与保护机制
    如何做好iOS应用安全?这有一把行之有效的“三板斧”
    微服务化不同阶段 Kubernetes 的不同玩法
    从B站、爱奇艺、映客的IPO上市,看国内视频公司的内容审核现状
    知物由学 | 你的网络安全问题背后的真正原因
    感动到流泪!数据分析师的福音:跨视图粒度计算
  • 原文地址:https://www.cnblogs.com/fengju/p/6336026.html
Copyright © 2011-2022 走看看