策略模式

引例:假如我们要分享一个篇文章。有微信分享、微博分享、QQ分享等......我们是先判断类型是哪个,然后再调用各自得API去做分享操作

一般来说,大多数人都会根据类型判断是哪个渠道吧,如下代码,但是随着渠道越来越多,那if也越来越多......

  1. //假如要分享一个东西。有微信分享、微博分享、QQ分享......
  2. public void share(String type) {
  3. if ("微信".equals(type)) {
  4. //微信分享操作
  5. System.out.println("微信分享处理...");
  6. } else if ("微博".equals(type)) {
  7. System.out.println("微博分享处理...");
  8. }else if ("头条".equals(type)) {
  9. System.out.println("头条分享处理...");
  10. }else if ("抖音".equals(type)) {
  11. System.out.println("抖音分享处理...");
  12. }else if ("网易云".equals(type)) {
  13. System.out.println("网易云分享处理...");
  14. }else if ("知乎".equals(type)) {
  15. System.out.println("知乎分享处理...");
  16. } else if ("QQ".equals(type)) {
  17. System.out.println("QQ分享处理...");
  18. } else {
  19. // 一大堆,这种可以采用策略设计模式重构
  20. }
  21. }

换种写法可以嘛,switch case试试,看起来稍微好看了点,问题依然存在

  1. public void share(String type) {
  2. switch(trpe) {
  3. case "微信":
  4. System.out.println("微信分享处理...");
  5. break;
  6. case "微信":
  7. System.out.println("微信分享处理...");
  8. break;
  9. case "微博":
  10. System.out.println("微博分享处理...");
  11. break;
  12. case "头条":
  13. System.out.println("头条分享处理...");
  14. break;
  15. default:
  16. //其他得
  17. break;
  18. }
  19. }

再思考咋整,于是乎,想到用策略模式

简单说说策略模式

  • 就是定义一系列算法,把他们一个个封装起来,并且使他们可相互替换
  • 主要解决再多种算法相似得情况下,使用if-else所带来得复杂和难以维护
  • 简单案例:
    • 诸葛亮得锦囊妙计,每一个锦囊就是一个策略
    • 旅行得出游方式,每一种方式就是一个策略

示例:

  1. 搞一个接口 DealStrategy 里面是一个处理方法
  1. public interface DealStrategy {
  2. public void dealWith(String type);
  3. }
  1. 创建实现类
  • QQ分享得实例
  1. public class QQDealStrategy implements DealStrategy {
  2. @Override
  3. public void dealWith(String type) {
  4. System.out.println(type + "QQ 分享成功...");
  5. }
  6. }
  • Sina分享
  1. public class SinaDealStrategy implements DealStrategy {
  2. @Override
  3. public void dealWith(String type) {
  4. System.out.println(type + "sina 微博 分享成功...");
  5. }
  6. }
  • Wechat分享
  1. public class WechatDealStrategy implements DealStrategy {
  2. @Override
  3. public void dealWith(String type) {
  4. System.out.println(type + "Wechat 分享成功...");
  5. }
  6. }
  1. 创建一个Context上下文,负责使用策略
  1. public class StrategyContext {
  2. private String type;
  3. private DealStrategy strategy;
  4. public StrategyContext(String type, DealStrategy strategy) {
  5. this.type = type;
  6. this.strategy = strategy;
  7. }
  8. public DealStrategy getStrategy() {
  9. return strategy;
  10. }
  11. public boolean options(String type) {
  12. return this.type.equals(type);
  13. }
  14. }
  1. 使用上下文来做我们分享文章得需求
  • 把所有策略装到list里,并且加载好
  • 通过context上下文,去切换使用策略分享
  1. public class TestStrategy {
  2. private static List<StrategyContext> list = new ArrayList<>();
  3. //加载所有策略
  4. static {
  5. list.add(new StrategyContext("Wechat", new WechatDealStrategy()));
  6. list.add(new StrategyContext("QQ", new QQDealStrategy()));
  7. list.add(new StrategyContext("Sina", new SinaDealStrategy()));
  8. }
  9. public void share(String type) {
  10. DealStrategy dealStrategy = null;
  11. for (StrategyContext context: list) {
  12. if (context.options(type)) {
  13. dealStrategy = context.getStrategy();
  14. break;
  15. }
  16. }
  17. dealStrategy.dealWith(type);
  18. }
  19. public static void main(String[] args) {
  20. new TestStrategy().share("Wechat");
  21. }
  22. }

以上,我们随意使用,type为啥都行,只要有这个策略,自动去切换...

想要扩展得话,也很简单,先把独立得策略写好,装配到上下文,然后使用

--纸上得来终觉浅,绝知此事要躬行--大佬们要去试试哈~!!

单例模式有效解决过多的if-else的更多相关文章

  1. 牛客网Java刷题知识点之什么是单例模式?解决了什么问题?饿汉式单例(开发时常用)、懒汉式单例(面试时常用)、单例设计模式的内存图解

    不多说,直接上干货! 什么是单例设计模式? 解决的问题:可以保证一个类在内存中的对象唯一性,必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性. 如何保证? 1.不允许其他程序用new ...

  2. 【设计模式 - 2】之单例模式(Singleton)

    1      模式简介 单例模式在代码中是非常常用的,如线程池.数据库连接.注册表.共享资源.一些非常消耗资源的组件,等等. 单例模式主要解决如下问题: 确保一个特殊类的实例是独一无二的: 确保这个类 ...

  3. (1) 类构造块,this(),static,单例模式串讲

    类构造块 在类只用一对大括号包含的内容,构造所有的对象时都会执行的内容,如果某个类有好几个够赞函数,公共部分抽取出来,放到构造块中. clas Boy { ... { syso("哭...& ...

  4. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  5. 单例模式和angular的services的使用方法

    在现实生活中存在着有这样的特点的一些类: A.这些类只能有一个实例: B.这些能够自动实例化: C.这个类对整个系统可见,即必须向整个系统提供这个实例. 不妨举一个具体的单例模式的例子:比如教室里面的 ...

  6. 《Java中的单例模式--两种》

    //单例模式:饿汉式和懒汉式 //单例模式 /* 设计模式:解决某一类问题行之有效的解决办法(思想). 单例(Singleton):设计模式: 学习设计模式必须先弄清楚它是解决什么问题的. 单例模式是 ...

  7. java学习面向对象之设计模式之单例模式

    就像上一节当中我们讲到的数组工具集一样,如果我们把他看作一个类,来应用,不阻止他new函数的话,这个类我们在整个过程当中我们只是用他来当一个工具.假如每次用都要new一下产生一个新对象的话,就会显得整 ...

  8. 单例模式 - OK

    单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点. 一.单例模式 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象.一个最好的办法就是,让 ...

  9. PHP 面向对象:设计模式之单例模式

    单例模式要解决的问题就是“如何让这个类只有一个实例”. 我们的web应用中,大量使用了数据库连接,如果反复建立与数据库的连接必然消耗更多的系统资源. 我们如何解决这个问题,建立唯一的数据库连接是必要的 ...

随机推荐

  1. (10)Linux挂载详解

    1.在 Linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构). 因此产生的问题是,当在 Linux 系统中使用这些硬件设备时,只有将Linux本身的文件目录与硬件设备的 ...

  2. 给jekyll博客添加天气插件

    layout: post title: 给博客添加天气插件 date: 2020-04-26 author: Dapenson header-img: img/post-bg-debug.png ca ...

  3. 快速导出jekyll博客文件进行上传部署

    快速导出jekyll博客文件进行上传部署 在使用markdown书写jekyll博客时,经常需要写一个头部信息用以让jekyll读取博文信息,这是一件比较麻烦的事,因此我使用HTML实现了一个快速导出 ...

  4. C# 使用PictureBox实现图片按钮控件

    引言 我们有时候会在程序的文件夹里看见一些图标,而这些图标恰好是作为按钮的背景图片来使用的.鼠标指针在处于不同状态时,有"进入按钮"."按下左键"," ...

  5. HDU6321 Dynamic Graph Matching【状压DP 子集枚举】

    HDU6321 Dynamic Graph Matching 题意: 给出\(N\)个点,一开始没有边,然后有\(M\)次操作,每次操作加一条无向边或者删一条已经存在的边,问每次操作后图中恰好匹配\( ...

  6. 【bzoj 2339】[HNOI2011]卡农(数论--排列组合+逆元+递推)

    题意:从编号为 1~N 的音阶中可选任意个数组成一个音乐片段,再集合组成音乐篇章.要求一个音乐篇章中的片段不可重复,都不为空,且出现的音符的次数都是偶数个.问组成 M 个片段的音乐篇章有多少种.答案取 ...

  7. Codeforces Global Round 9 B. Neighbor Grid (构造,贪心)

    题意:给一个\(n\)X\(m\)的矩阵,矩阵中某个数字\(k\)表示其四周恰好有\(k\)个不为0的数字,你可以使任意位置上的数字变大,如果操作后满足条件,输出新矩阵,否则输出NO. 题解:贪心,既 ...

  8. C#之字符编码

    在 Windows Vista 及之后的版本中,每个Unicode字符都使用UTF-16编码,UTF的全称是 Unicode Transformation Format(Unicode 转换格式).U ...

  9. Python_小程序

    一.开发前的准备工作 1.申请AppID:一个账号对应一个小程序,个人/个体只能申请5个小程序 2.下载开发工具 二.小程序的文件结构 三. 1.数据绑定 1.1数据的设置 Page( data:{ ...

  10. MySQL 回表查询 & 索引覆盖优化

    回表查询 先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记录数据 建表示例 mysql> create table user( -> id int(10) auto_incre ...