策略模式

引例:假如我们要分享一个篇文章。有微信分享、微博分享、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. 5.2 spring5源码--spring AOP源码分析二--切面的配置方式

    目标: 1. 什么是AOP, 什么是AspectJ 2. 什么是Spring AOP 3. Spring AOP注解版实现原理 4. Spring AOP切面原理解析 一. 认识AOP及其使用 详见博 ...

  2. promise封装微信小程序的request

    1.在utils下创建一个 request.js文件,然后将方法导出 const app = getApp(); //使用promise封装request请求 const POST = (url, p ...

  3. A - 欧拉回路

    欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是节点数N ...

  4. 分组背包 例题:hdu 1712 ACboy needs your help

    分组背包需求 有N件物品,告诉你这N件物品的重量以及价值,将这些物品划分为K组,每组中的物品互相冲突,最多选一件,求解将哪些物品装入背包可使这些物品的费用综合不超过背包的容量,且价值总和最大. 解题模 ...

  5. CodeForces 893C (并查集板子题)

    刷题刷到自闭,写个博客放松一下 题意:n个人,m对朋友,每寻找一个人传播消息需要花费相应的价钱,朋友之间传播消息不需要花钱,问最小的花费 把是朋友的归到一起,求朋友中花钱最少的,将所有最少的加起来. ...

  6. 【noi 2.6_9283】&【poj 3088】Push Botton Lock(DP--排列组合 Stirling数)

    题意:N个编号为1~N的数,选任意个数分入任意个盒子内(盒子互不相同)的不同排列组合数. 解法:综合排列组合 Stirling(斯特林)数的知识进行DP.C[i][j]表示组合,从i个数中选j个数的方 ...

  7. hdu3706 Second My Problem First

    Problem Description Give you three integers n, A and B.  Then we define Si = Ai mod B and Ti = Min{ ...

  8. CF1415-C. Bouncing Ball

    CF1415-C. Bouncing Ball 题意: 在\(x\)轴上有\(n\)个点(从\(1\)到\(n\)),每个点都有一个值\(0\)或\(1\),\(0\)代表这个点不能走,\(1\)代表 ...

  9. 谈一谈phar 反序列化

    前言 来自Secarma的安全研究员Sam Thomas发现了一种新的漏洞利用方式,可以在不使用php函数unserialize()的前提下,引起严重的php对象注入漏洞.这个新的攻击方式被他公开在了 ...

  10. Hacker101 CTF-Micro-CMS v2

    一.打开网站是这个样子 找到一个登录框,存在注入漏洞 3.我们可以这样更改用户名中的输入: admin' or 1=1 -- 4.错误消息显示Invalid Password,因此我们也应该尝试构造一 ...