当前位置: 首页 > news >正文

Java设计模式【策略模式】

一、前言

1.1 背景

针对某种业务可能存在多种实现方式,传统方式是通过传统if…else…或者switch代码判断;

弊端

  • 代码可读性差
  • 扩展性差
  • 难以维护

1.2 简介

策略模式是一种行为型模式,它将对象和行为分开,将行为定义为一个行为接口和具体行为的实现。

组成

  • 抽象策略类(Strategy):策略的抽象
  • 具体策略类(ConcreteStrategy):具体的策略实现
  • 环境类(Context):用来操作策略的上下文环境;

二、案例代码

此处以Iphone的制造商举例:抽象策略类(IphoneProducer),具体策略类(ChinaIphoneProducer、VietnamIphoneProducer、USAIphoneProducer),环境类(ProducerContext)

package com.qiangesoft.design.behavioral.strategy;/*** 策略模式*/
public class Strategy {public static void main(String[] args) {ProducerContext context = new ProducerContext();// 中国context.setProducer(new ChinaIphoneProducer());System.out.println("Made in " + context.produce().getProducer());// 越南context.setProducer(new VietnamIphoneProducer());System.out.println("Made in " + context.produce().getProducer());// 美国context.setProducer(new USAIphoneProducer());System.out.println("Made in " + context.produce().getProducer());}
}/*** 1.策略接口* 此处:Iphone制造商*/
interface IphoneProducer {/*** 生产*/Iphone produce();
}/*** 2.策略实现类* 中国制造商、越南制造商、美国制造商*/
class ChinaIphoneProducer implements IphoneProducer {@Overridepublic Iphone produce() {return new Iphone("China");}
}class VietnamIphoneProducer implements IphoneProducer {@Overridepublic Iphone produce() {return new Iphone("Vietnam");}
}class USAIphoneProducer implements IphoneProducer {@Overridepublic Iphone produce() {return new Iphone("USA");}
}/*** 3.环境类*/
class ProducerContext {private IphoneProducer producer;public void setProducer(IphoneProducer producer) {this.producer = producer;}public Iphone produce() {return producer.produce();}
}/*** 苹果手机*/
class Iphone {/*** 制造商*/private String producer;public Iphone(String producer) {this.producer = producer;}public String getProducer() {return producer;}public void setProducer(String producer) {this.producer = producer;}
}

三、总结

优点

  • 切换算法方便
  • 避免大量的条件语句
  • 提高代码的复用性
  • 降低耦合度

缺点

  • 策略类过多(类爆炸)
  • 客户端必须了解所有的策略类
  • 策略模式的对象数量过多占用更多的内存空间
http://www.lryc.cn/news/303344.html

相关文章:

  • (13)Hive调优——动态分区导致的小文件问题
  • 【linux】使用g++调试内存泄露:AddressSanitizer
  • 第三百五十七回
  • 新版Java面试专题视频教程——框架篇
  • 网络爬虫实战 | 上传以及下载处理后的文件
  • Linux--shell编程中有关while循环的详细内容
  • 回归测试与重新测试
  • java 版本企业招标投标管理系统源码+多个行业+tbms+及时准确+全程电子化
  • 详解动态内存管理!
  • iocp简单例子
  • HAL STM32 HW I2C DMA + SSD1306/SH1106驱动示例
  • grafana配置钉钉告警模版(一)
  • 佳能2580的下载手册
  • YOLO-World:实时开放词汇目标检测
  • Unity中关于群组的一些组件
  • 面向对象详解,面向对象的三大特征:封装、继承、多态
  • 【阿里云服务器的一些使用坑】都是无知的泪水呀
  • Docker的常用命令||Docker是个流行的容器化平台,它允许你打包、分发和运行应用程序。
  • 汽车电子论文学习--电动汽车电机驱动系统动力学特性分析
  • c++的一些陌生用法记录
  • Vue | (三)使用Vue脚手架(中)| 尚硅谷Vue2.0+Vue3.0全套教程
  • TenorFlow多层感知机识别手写体
  • Java基础(二十六):Java8 Stream流及Optional类
  • qt - 19种精美软件样式
  • vue 使用docx库生成word表格文档
  • ElementUI table表格组件实现双击编辑单元格失去焦点还原,支持多单元格
  • Java基于SpringBoot+Vue的图书管理系统
  • 【云安全】Hypervisor与虚拟机
  • JS文本加密方法探究
  • 推荐彩虹知识付费商城免授权7.0源码