设计模式 | 策略模式
1 前言
在策略模式(Strategy Pattern) 中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
典型应用场景就是比较器,本文将实现一个通用的比较器
2 比较器的实现
这是策略器-比较器的包结构,具体代码以及描述在下方
场景:我们要实现一个可以适用于不同场景的比较器,比如比较猫的大小(分别可以使用身高、体重做比较)、比较狗的大小(分别使用饭量、身高做比较)…等等
2.1 猫狗po定义
Cat.java
package com.chen.design_pattern.strategy.po;public class Cat {public int height;public int weight;@Overridepublic String toString() {return "Cat{" +"height=" + height +", weight=" + weight +'}';}public Cat(int height, int weight) {this.height = height;this.weight = weight;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}
}
Dog.java
package com.chen.design_pattern.strategy.po;public class Dog {public int height;public int weight;public Dog(int height, int weight) {this.height = height;this.weight = weight;}@Overridepublic String toString() {return "Dog{" +"height=" + height +", weight=" + weight +'}';}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}
}
2.2 比较器定义
先生成一个通用接口
Comparator.java
package com.chen.design_pattern.strategy.comparator;public interface Comparator<T> {int compare(T o1, T o2);}
对接口进行不同的实现:
猫身高比较器:CatHeightComparator.java
package com.chen.design_pattern.strategy.comparator;import com.chen.design_pattern.strategy.po.Cat;public class CatHeightComparator implements Comparator<Cat> {@Overridepublic int compare(Cat o1, Cat o2) {if (o1.height > o2.height) return 1;else if (o1.height < o2.height) return -1;return 0;}
}
猫体重比较器:CatWeightComparator.java
package com.chen.design_pattern.strategy.comparator;import com.chen.design_pattern.strategy.po.Cat;public class CatWeightComparator implements Comparator<Cat> {@Overridepublic int compare(Cat o1, Cat o2) {if (o1.weight > o2.weight) return 1;else if (o1.weight < o2.weight) return -1;return 0;}
}
2.3 比较并交换的实现(交换排序算法器)
Sorter.java
package com.chen.design_pattern.strategy.sorter;import com.chen.design_pattern.strategy.comparator.Comparator;public class Sorter<T> {public void sort(T[] arr, Comparator<T> comparator) {for (int i = 0; i < arr.length - 1; i++) {int minPos = i;for (int j = i + 1; j < arr.length; j++) {minPos = comparator.compare(arr[j], arr[minPos]) == -1 ? j : minPos;}swap(arr, i, minPos);}}private void swap(T[] arr, int i, int minPos) {T temp = arr[i];arr[i] = arr[minPos];arr[minPos] = temp;}
}
2.4 定义Main方法
Main.java
package com.chen.design_pattern.strategy;import com.chen.design_pattern.strategy.comparator.CatHeightComparator;
import com.chen.design_pattern.strategy.comparator.CatWeightComparator;
import com.chen.design_pattern.strategy.po.Cat;
import com.chen.design_pattern.strategy.sorter.Sorter;import java.util.Arrays;public class Main {public static void main(String[] args) {Cat[] cats = {new Cat(12, 50),new Cat(222, 30),new Cat(3, 40)};Sorter<Cat> sorter = new Sorter<>();// 按照猫的身高排序sorter.sort(cats, new CatHeightComparator());System.out.println("身高排序: " + Arrays.toString(cats));// 按猫的体重排序sorter.sort(cats, new CatWeightComparator());System.out.println("体重排序: " + Arrays.toString(cats));}
}
3 运行结果验证
只需要new一个Sorter() 并指定比较类型的为泛型,传入对应的数组和比较器规则(Comparator) 即可完成同一实体类之间不同属性的比较以及排序
设计模式 | 策略模式相关推荐
- Python设计模式-策略模式
Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...
- 关于设计模式——策略模式-Strategy Pattern
文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...
- [设计模式] ------ 策略模式
策略模式 它定义了算法家族,分别封装起来,让他们直接可以互相替换,此模式让算法的变化,不会影响到使用算法的客户 其实很简单,可能很多人都用到了,只不过还不知道这就是策略模式而已. 比如定义一个接口A, ...
- java 策略模式 促销_java设计模式——策略模式
一. 定义与类型 定义:针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换.策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能.当代码中 ...
- Springboot 使用设计模式- 策略模式
前言 直白点,什么场景我们需要使用到设计模式- 策略模式. 在平常的springboot项目里面做CRUD,我们的习惯性基本是 一个mapper,一个service,一个serviceImpl. 但是 ...
- 李建忠设计模式——策略模式Strategy
目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...
- 15. 星际争霸之php设计模式--策略模式
题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...
- Java设计模式-策略模式作业
Java设计模式-策略模式作业,所有类和接口均在一个package内 文章目录 前言 一.作业内容 二.具体实现 1.类图 2.Strategy接口 3.PreCopyStrategy类 4.Post ...
- 设计模式-策略模式2.0
设计模式-策略模式2.0 前面文章我们说过了传统的策略模式的实现,本文我们简单说下设计模式中的升级版的策略模式,策略模式2.0. 代码实现 talk is cheap show me the code ...
- 设计模式-策略模式(Strategy)-Java
设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...
最新文章
- 取代百度!美团成中国第三大互联网公司
- MacBook(m1)配置Python注意事项(自用,持续更新)
- flink搭建集群(一主三从)
- CSS:盒子模型和清除float浮动的三种常用方法
- 常用的第三方库(OC)
- php服务器估算,使用zabbix API估算服务器磁盘空间可用天数
- 03.基于测试开发讲解和Cobertura框架介绍
- poj 2502 Subway dijkstra基础 !!!!入门题
- 有一个无法超越的神国,叫“外国”
- 【经典算法实现 15】阿克曼函数(非递归实现)
- 2023年西北工业大学材料科学与工程考研考情与难度、参考书及上岸前辈初复试备考经验指导
- 软件文档写作学习总结——绪论
- MySQL之存储过程及函数的使用
- STC 51单片机53——电子指南针HMC5883l
- html5个人收藏页面,safari个人收藏全不见 大侠不过一剑之遥是倚天的新版本吗?...
- IBM创始人 托马斯·约翰·沃森父子
- 基于FPGA的啸叫检测与抑制系统设计与实现verilog
- 机上娱乐(IFE)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 魔兽世界经典怀旧服务器架设教程
- 配置华为S2300经验之浅谈