策略模式

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

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

//假如要分享一个东西。有微信分享、微博分享、QQ分享......
public void share(String type) {
if ("微信".equals(type)) {
//微信分享操作
System.out.println("微信分享处理...");
} else if ("微博".equals(type)) {
System.out.println("微博分享处理...");
}else if ("头条".equals(type)) {
System.out.println("头条分享处理...");
}else if ("抖音".equals(type)) {
System.out.println("抖音分享处理...");
}else if ("网易云".equals(type)) {
System.out.println("网易云分享处理...");
}else if ("知乎".equals(type)) {
System.out.println("知乎分享处理...");
} else if ("QQ".equals(type)) {
System.out.println("QQ分享处理...");
} else {
// 一大堆,这种可以采用策略设计模式重构
}
}

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

public void share(String type) {
switch(trpe) {
case "微信":
System.out.println("微信分享处理...");
break;
case "微信":
System.out.println("微信分享处理...");
break;
case "微博":
System.out.println("微博分享处理...");
break;
case "头条":
System.out.println("头条分享处理...");
break;
default:
//其他得
break;
}
}

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

简单说说策略模式

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

示例:

  1. 搞一个接口 DealStrategy 里面是一个处理方法
 public interface DealStrategy {
public void dealWith(String type);
}
  1. 创建实现类
  • QQ分享得实例
public class QQDealStrategy implements DealStrategy {
@Override
public void dealWith(String type) {
System.out.println(type + "QQ 分享成功...");
}
}
  • Sina分享
public class SinaDealStrategy implements DealStrategy {
@Override
public void dealWith(String type) {
System.out.println(type + "sina 微博 分享成功...");
}
}
  • Wechat分享
public class WechatDealStrategy implements DealStrategy {
@Override
public void dealWith(String type) {
System.out.println(type + "Wechat 分享成功...");
}
}
  1. 创建一个Context上下文,负责使用策略
public class StrategyContext {
private String type;
private DealStrategy strategy; public StrategyContext(String type, DealStrategy strategy) {
this.type = type;
this.strategy = strategy;
} public DealStrategy getStrategy() {
return strategy;
} public boolean options(String type) {
return this.type.equals(type);
}
}
  1. 使用上下文来做我们分享文章得需求
  • 把所有策略装到list里,并且加载好
  • 通过context上下文,去切换使用策略分享
public class TestStrategy {

    private static List<StrategyContext> list = new ArrayList<>();
//加载所有策略
static {
list.add(new StrategyContext("Wechat", new WechatDealStrategy()));
list.add(new StrategyContext("QQ", new QQDealStrategy()));
list.add(new StrategyContext("Sina", new SinaDealStrategy()));
} public void share(String type) {
DealStrategy dealStrategy = null;
for (StrategyContext context: list) {
if (context.options(type)) {
dealStrategy = context.getStrategy();
break;
}
}
dealStrategy.dealWith(type);
} public static void main(String[] args) {
new TestStrategy().share("Wechat");
}
}

以上,我们随意使用,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. TCP/IP__TCP协议IP协议&IP地址

    IP协议(Internet Protocol) 1.   定位:计算机网络间相互连接进行通信而定义的协议.在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进 ...

  2. 整理我的Git常见问题和命令

    整理我的Git常见问题和命令 目录 整理我的Git常见问题和命令 提交注释规范 合并分支 clone & 切换分支 支持中文路径显示 账户及密码 基于远程分支创建本地分支 提交注释规范 举例: ...

  3. Java 容器系列总结

    为什么要使用集合 当我们需要保存一组类型相同的数据的时候,我们应该是用一个容器来保存,这个容器就是数组,但是,使用数组存储对象具有一定的弊端, 因为我们在实际开发中,存储的数据的类型是多种多样的,于是 ...

  4. 代码审计学习01-in_array() 函数缺陷

    一.开始代码审计之旅 01 从今天起,学习代码审计了,这篇文章就叫代码审计01吧,题目来自 PHP SECURITY CALENDAR 2017 的第一题,结合 红日安全 写的文章,开始吧. 二.先看 ...

  5. 记一次由sql注入到拿下域控的渗透测试实战演练(下)

    本次渗透使用工具: mimikatz,PsExec 本次渗透网络拓扑图: 开始渗透: 上一篇文章中我们讲到我们成功渗透了目标内网中web服务器并提取其管理员明文密码,通过明文密码又成功登陆了内网中的另 ...

  6. H - 看病要排队

    看病要排队这个是地球人都知道的常识.不过经过细心的0068的观察,他发现了医院里排队还是有讲究的.0068所去的医院有三个医生(汗,这么少)同时看病.而看病的人病情有轻重,所以不能根据简单的先来先服务 ...

  7. Codeforces Round #684 (Div. 2)【ABC1C2】

    比赛链接:https://codeforces.com/contest/1440 A. Buy the String 题解 枚举字符串中 \(0\) 或 \(1\) 的个数即可. 代码 #includ ...

  8. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes

    传送门 题意: 先输入一个n,代表两个数组里面都有n个数,然后让你从中找到一个p<=n,使其满足(1<=l<=r<=p<=n)可以让在(l,r)这个区间内在两个数组中的的 ...

  9. 【uva 1153】Keep the Customer Satisfied(算法效率--贪心+优先队列)

    题意:有N个工作,已知每个工作需要的时间和截止时间.要求所有工作穿行完成,第一项任务开始的时间不早于时刻0.问最多能完成多少个工作.(N≤800000) 解法:贪心.可以模型化题目为:已知N个任务的长 ...

  10. ACdream1414 Geometry Problem

    Problem Description       Peter is studying in the third grade of elementary school. His teacher of ...