• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

设计模式——策略模式

互联网 diligentman 1周前 (04-29) 7次浏览

前言

本篇文章介绍了行为型模式——策略模式,策略模式是一个相对简单的设计模式

关于设计模式及单例模式的简述在我的前一篇文章浅谈设计模式及Singleton中有进行详细分析,感兴趣的可以翻翻。


索引

  • 前言
  • 策略模式(Strategy)
  • UML 图
  • 代码示例
  • 总结

策略模式(Strategy)

(定义瞟一眼就好,实操编写完才会有体会)

策略模式主要用于需要使用不同的算法来处理不同的数据(对象)。

其定义了一系列算法,并且使其可以替换使用。

一个类的行为或其算法可以在运行时更改。

UML 图

:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}






























Strategy







ConcreteStrategyA







ConcreteStrategyB







ConcreteStrategyC







Context


抽象策略类(Strategy):定义一个所有算法都支持的通用接口
具体策略类(Concrete Strategy):实现不同的算法
内容类(Context):包含一个对策略类的引用,利用引用调用不同算法
通常具体策略类由客户端创建,并传递给内容类。

代码示例

学习设计模式的最有效的方法就是学习代码结构及模仿,从而应用到实际开发中,仅仅看官方定义是不够的的。

策略模式的示例:
例如我们要对一个数组容器中的元素要排序,但是排序方法有很多种,而我们想使用不同的方法来实现,可以将排序逻辑与调用逻辑分开,策略模式的使用会让代码灵活性得到很大提升。

  1. 定义策略类,保存内容类的指针
public interface SortInterface {
    public void sort(int[] array);
}
  1. 对于SortInterface的不同实现
 public class QuickSort implements SortInterface{
    @Override
    public void sort(int[] array) {
        //快速排序逻辑
    }
}
public class BubbleSort implements SortInterface {
    @Override
    public void sort(int[] array) {
        //冒泡排序逻辑
    }
}
  1. 内容类
public class Sorter {
    //持有引用
    private SortInterface strategy;
    
    //构造函数,传递不同方法实现的对象参数
    public Sorter(SortInterface strategy) {
        this.strategy = strategy;
    }
    
    //父类引用指向子类对象,动态绑定
    public void doSort(int[] listToSort){
        strategy.sort(listToSort);
    }
}
  1. 客户端代码
public class SortMain {
    public static void main(String[] args) {
        int[] listToBeSort = {6,2,5,8,3,0};
        //可以创建不同排序方法对象作为参数,从而调用不同的策略方法
        Sorter sorter = new Sorter(new QuickSort());
        sorter.doSort(listToBeSort);
    }
}
  1. 目录
    设计模式——策略模式

总结

可以看出来,策略模式用到了面向对象中的多态思想,多态正是面向对象最牛的特性,很多设计模式就是利用多态思想来组织代码结构的。


程序员灯塔
转载请注明原文链接:设计模式——策略模式
喜欢 (0)