设计模式——行为型模式之策略(方法)、模板方法模式(能够帮助你设计高重用的方法的设计模式,面向对象里如何实现面向过程设计?)

设计模式——行为型模式之策略(方法)、模板方法模式(能够帮助你设计高重用的方法的设计模式,面向对象里如何实现面向过程设计?),第1张

设计模式——行为型模式之策略方法)、模板方法模式(能够帮助你设计高重用的方法的设计模式,面向对象里如何实现面向过程设计?)

文章目录
    • 前言
    • 一、定义和区别
    • 二、具体构造
      • 2.1 策略(方法)模式
      • 2.2 模板(方法)模式
      • 2.3 Java库中的具体应用
    • 三、总结评价
    • 设计模式系列文章
    • 结尾


前言

设计模式是进行实际开发的基石,是前人不断总结试错得出的宝贵开发经验,也是开发人员之间相互理解共同设计的关键标准。学习设计模式能够帮助我们初学者更好理解结构化的开发流程,摆脱只会写一段代码而不能上升为一个项目的不上不下的尴尬处境

作者更有一系列设计模式文章(还在持续更新),图例丰富,少量代码,适合入门,系列文章见末尾跳转

一、定义和区别

策略(方法)模式:定义一系列解决类似问题的不同方法,包装成策略类,提供统一接口可以供取用者自行更改选择。

  • 比如一个比较器:Comparator,你可以自己定义比较策略,从大到小or从小到大,还是按字典序等,都是为了解决“比较”这一问题的不同策略。

模板方法模式:定义了一套做一个任务的通用流程,并给出了部分不变的工作步骤的实现。

  • 比如要实现一个加密模板:读取文件和保存文件都是一模一样的,只需要修改其中的加密过程采用不同的加密方法即可,于是预先写好读取,保存步骤,继承的子类在自己实现加密步骤。

二者的区别在于:一个聚焦于解决问题的多种方法,一个聚焦于解决问题的固定步骤。

  • 若问题较小,一步到位/没有固定步骤——策略(方法)模式;
  • 若问题由多步组合而成,又有固定不变的过程——模板方法模式
二、具体构造 2.1 策略(方法)模式


通过统一的接口类Startegy——约定了实现该接口的类都能提供dealPromblem方法解决问题,而且具体策略之间不会相互影响,可以自由添加和修改以指定不同策略。

  • 倘若直接将策略写入使用者中,更改策略会很麻烦,而且使用者的方法会过于臃肿复杂。这样将策略(方法)独立为一个类有效切分了功能,还使得代码易于维护。
2.2 模板(方法)模式

通过两张图的对比,大体都是统一了一个父类/接口,但是模板方法类中步骤更多,包含有不需要子类继承实现的固定步骤。

  • 模板方法提供了工作流程模板,子类只需要对其进行填充即可,保证了流程更可靠,而且模板方法有很高的复用性(想想PPT模板,论文模板是不是减少了你的前期工作,而且使用范围很广)。
2.3 Java库中的具体应用

相信大家对Arrays.sort()这个排序方法都不陌生,但是对其原理和高级应用大家是否清楚呢?

  • Arrays.sort()方法能够对所有数组进行排序,他提供一系列排序步骤,而同时允许其自定义比较规则。这里Arrays.sort()本身不需要继承扩展,而是直接将比较器Comparator(这里又是一种策略方法的实例),作为参数传入Arrays.sort()方法中,相当于自定义了排序过程中的比较步骤。

这里我引用了该博客的例子——Comparator详解

package cn.comparator.A;
import java.util.Comparator;

public class ComparatorLength implements Comparator{
    
    @Override
    public int compare(String o1, String o2) {
        int len1 = o1.length();
        int len2 = o2.length();
        return (len1 - len2 > 0) ? 1 : -1;
    }
}
@Test
    public void test2(){
        String[] str = {"aadsaf","dqwd","dqwfcsqc","xqsccaac","csfwffqaf","czxca","cas","cacs","casc"};
        Comparator com1 = new ComparatorLength();
        Comparator com2 = new ComparatorLength();
        Arrays.sort(str, com1);
        System.out.println(Arrays.toString(str));
        Arrays.sort(str, com2);
        System.out.println(Arrays.toString(str));
        System.out.println((com1 == com2) +"--"+ (com1.equals(com2)));
    }

比较结果

三、总结评价

二者都是较为简单的设计模式。
优点:

  • 都能提高代码的重用,使得代码易于维护(策略模式将各种策略独立,不会相互影响,不给使用者添麻烦;而模板方法模式提供主体模板,使得子类DIY有流程可依,且实现了固定步骤)
  • 模板方法主要在于——提取了公共方法实现,而由子类实现细节处理
  • 策略模式——一个接口自由切换策略,使得策略和策略使用者解耦

缺点:

  • 都大大增加了类的种类,使得系统更加复杂
设计模式系列文章 系列文章:

一、创建型模式——工厂模式
二、创建型模式——单例模式、原型模式
三、创建型模式——建造者模式
四、结构型模式——装饰者模式
五、结构型模式——代理、适配器模式
六、结构型模式——外观模式
七、结构型模式——三合一(组合模式、桥接模式、享元模式)
八、行为型模式——观察者模式
九、行为型模式——迭代器模式
十、行为型模式——模板方法、策略方法模式


结尾

作者长期更新,如果觉得本文还算不错的话,请给我一个大大的赞!!!
如果非常赞同这篇文章,请关注我,持续了解更多精彩博文!!!

作者主攻Java Web方向,平时长期更新Java Web基础概念文章,以及算法和数据结构——【一日双题—见微知著】系列。同时设计模式系列也会尽快一月内完结

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5696284.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存