单例模式有效解决过多的if-else
策略模式
引例:假如我们要分享一个篇文章。有微信分享、微博分享、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所带来得复杂和难以维护
- 简单案例:
- 诸葛亮得锦囊妙计,每一个锦囊就是一个策略
- 旅行得出游方式,每一种方式就是一个策略
示例:
- 搞一个接口 DealStrategy 里面是一个处理方法
public interface DealStrategy {
public void dealWith(String type);
}
- 创建实现类
- 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 分享成功...");
}
}
- 创建一个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);
}
}
- 使用上下文来做我们分享文章得需求
- 把所有策略装到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的更多相关文章
- 牛客网Java刷题知识点之什么是单例模式?解决了什么问题?饿汉式单例(开发时常用)、懒汉式单例(面试时常用)、单例设计模式的内存图解
不多说,直接上干货! 什么是单例设计模式? 解决的问题:可以保证一个类在内存中的对象唯一性,必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性. 如何保证? 1.不允许其他程序用new ...
- 【设计模式 - 2】之单例模式(Singleton)
1 模式简介 单例模式在代码中是非常常用的,如线程池.数据库连接.注册表.共享资源.一些非常消耗资源的组件,等等. 单例模式主要解决如下问题: 确保一个特殊类的实例是独一无二的: 确保这个类 ...
- (1) 类构造块,this(),static,单例模式串讲
类构造块 在类只用一对大括号包含的内容,构造所有的对象时都会执行的内容,如果某个类有好几个够赞函数,公共部分抽取出来,放到构造块中. clas Boy { ... { syso("哭...& ...
- 【白话设计模式四】单例模式(Singleton)
转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...
- 单例模式和angular的services的使用方法
在现实生活中存在着有这样的特点的一些类: A.这些类只能有一个实例: B.这些能够自动实例化: C.这个类对整个系统可见,即必须向整个系统提供这个实例. 不妨举一个具体的单例模式的例子:比如教室里面的 ...
- 《Java中的单例模式--两种》
//单例模式:饿汉式和懒汉式 //单例模式 /* 设计模式:解决某一类问题行之有效的解决办法(思想). 单例(Singleton):设计模式: 学习设计模式必须先弄清楚它是解决什么问题的. 单例模式是 ...
- java学习面向对象之设计模式之单例模式
就像上一节当中我们讲到的数组工具集一样,如果我们把他看作一个类,来应用,不阻止他new函数的话,这个类我们在整个过程当中我们只是用他来当一个工具.假如每次用都要new一下产生一个新对象的话,就会显得整 ...
- 单例模式 - OK
单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点. 一.单例模式 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象.一个最好的办法就是,让 ...
- PHP 面向对象:设计模式之单例模式
单例模式要解决的问题就是“如何让这个类只有一个实例”. 我们的web应用中,大量使用了数据库连接,如果反复建立与数据库的连接必然消耗更多的系统资源. 我们如何解决这个问题,建立唯一的数据库连接是必要的 ...
随机推荐
- Codeforces Round #627 (Div. 3) F - Maximum White Subtree(深度优先搜索)
题意: n 个点 n - 1 条边的树,问每个点所在所有子树中白黑点数目的最大差. 思路: 白点先由下至上汇集,后由上至下分并. #include <bits/stdc++.h> usin ...
- Scrambled Polygon POJ - 2007 极角排序
题意: 给你n个点,这n个点可以构成一个多边形(但是不是按顺序给你的).原点(0,0)为起点,让你按顺序逆序输出所有点 题解: 就是凸包问题的极角排序 用double一直Wa,改了int就可以了 // ...
- Codeforces Round #646 (Div. 2) E. Tree Shuffling(树上dp)
题目链接:https://codeforces.com/contest/1363/problem/E 题意 有一棵 $n$ 个结点,根为结点 $1$ 的树,每个结点有一个选取代价 $a_i$,当前 $ ...
- codeforces B. Pasha and String
Pasha got a very beautiful string s for his birthday, the string consists of lowercase Latin letters ...
- Codeforces #6241 div2 C. Orac and LCM (数学)
题意:给你一个数列,求所有子序列对的\(lcm\),然后求这些所有\(lcm\)的\(gcd\). 题解:我们对所有数分解质因数,这里我们首先要知道一个定理: 对于\(n\)个数,假如某个质数\( ...
- httpclient几种请求方式
一.httpclient 模拟get请求,并获取cookie信息 public class MyCookiesForGet { private String url; //用来读取.propertie ...
- 轻松理解 Java开发中的依赖注入(DI)和控制反转(IOC)
前言 关于这个话题, 网上有很多文章,这里, 我希望通过最简单的话语与大家分享. 依赖注入和控制反转两个概念让很多初学这迷惑, 觉得玄之又玄,高深莫测. 这里想先说明两点: 依赖注入和控制反转不是高级 ...
- 【cpp上】课后正误小题
State whether each of the following is true or false. If false, explain why. Assume the state ment u ...
- leetcode8 字符串转换整数
<cctype> isdigit(char) 问题:在做乘法,加法前,先判断是否溢出 &&优先级大于== 然后教训: 考虑情况不周.比如3.14这样 然后解决办法 多自己搞 ...
- 009.NET5_程序的发布运行
发布 相差了web.config文件 脚本启动 cmd,进入程序根目录. 带参启动 其实,最终与web.config中效果一样