else 策略模式去掉if_如何用卫语句、策略模式、状态模式重构if-else语句

《java开发手册》中:

况且日常开发时遇到一推的if-else着实让人头疼!

so,现在开始改造

一、卫语句

卫语句就是把复杂的条件表达式拆分成多个条件表达式,即代码逻辑先考虑失败、异常、中断、退出等直接返回的情况,以方法多个出口的方式,解决代码中判断分支嵌套的问题,这是逆向思维的体现

比如:

if (type == 0) {

code...

}else if (type == 1) {

code...

} else if (type == 2) {

code...

} else {

otherCode...

}

可以改造为:

if (type == 0) {

code...

return;

}

if (type == 1) {

code...

return;

}

if (type == 2) {

code...

return;

}

otherCode....

二、策略模式

现在有个需求,根据用户的类型来展示不同的内容,我们将其具体化为一段代码:

if ("新客户".equals(userType)) {

showNewContent...;

}else if("VIP客户".equals(userType)){

showVIPContent...;

}else if ("白金客户".equals(userType)) {

showPlatinaContent...;

}else if ("黑卡用户".equals(userType)){

showBlackCardContent...;

}else if ("回归用户".equals(userType)){

showComeBackContent...;

}else {

showOtherContent...;

}

这样看是看不出来有何不妥的,但是想想,要推荐的内容何止这么点代码,如果不管不顾,就这么写,到时候写完代码回过头来,自己都得看老半天才能看懂,何论后期维护的人呢,而且要是后期又添加了一种新的用户类型,那是不是又要写一个else-if插在中间,然后又增量添加一推代码,这样岂不是太麻烦了?,反正强迫症肯定是受不了的

策略模式改造:

1.定义一个策略接口

public interface ShowStrategy{

void showContentByUserType();

}

2.定义多个具体的策略实现

public class ShowNewContentStrategy implements ShowStrategy {

@Override

public void showContentByUserType() {

System.out.println("展示新用户内容");

}

}

public class ShowVIPContentStrategy implements ShowStrategy {

@Override

public void showContentByUserType() {

System.out.println("展示VIP用户内容");

}

}

public class ShowPlatinaContentStrategy implements ShowStrategy {

@Override

public void showContentByUserType() {

System.out.println("展示白金用户内容");

}

}

public class ShowBlackCardContentStrategy implements ShowStrategy {

@Override

public void showContentByUserType() {

System.out.println("展示黑卡用户内容");

}

}

public class ShowComeBackContentStrategy implements ShowStrategy {

@Override

public void showContentByUserType() {

System.out.println("展示回归用户内容");

}

}

3.定义一个策略使用的client

public class ShowStrategyClient {

//持有一个策略接口引用

private ShowStrategy showStrategy;

//注入

public ShowStrategyClient(ShowStrategy showStrategy) {

this.showStrategy = showStrategy;

}

//策略client的方法

public void clientMethod(){

showStrategy.showContentByUserType();

}

}

4.外部使用

回到我们的需求,用写好的策略模式重构

public void test() {

//1.创建新用户的内容展示策略

ShowStrategy newContentStrategy = new ShowNewContentStrategy();

//2.创建策略客户端,注入新用户策略实现

ShowStrategyClient showStrategyClient = new ShowStrategyClient(newContentStrategy);

showStrategyClient.clientMethod();

}

三、状态模式

继续引用我们在“二、策略模式”中的例子

状态模式改造:

1.定义一个状态行为接口

interface UserState {

void showNewContent(ShowStateClient client);

void showVIPContent(ShowStateClient client);

void showPlatinaContent(ShowStateClient client);

void showBlackCardContent(ShowStateClient client);

void showComeBackContent(ShowStateClient client);

}

2.定义多个具体的状态实现

public class ShowNewContentState implements UserState {

@Override

public void showNewContent(ShowStateClient client) {

System.out.println("展示新用户内容");

}

@Override

public void showVIPContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showPlatinaContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showBlackCardContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showComeBackContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

}

public class ShowVIPContentState implements UserState {

@Override

public void showNewContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showVIPContent(ShowStateClient client) {

System.out.println("展示VIP用户内容");

}

@Override

public void showPlatinaContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showBlackCardContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showComeBackContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

}

public class ShowPlatinaContentState implements UserState {

@Override

public void showNewContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showVIPContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showPlatinaContent(ShowStateClient client) {

System.out.println("展示白金用户内容");

}

@Override

public void showBlackCardContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showComeBackContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

}

public class ShowBlackCardContentState implements UserState {

@Override

public void showNewContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showVIPContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showPlatinaContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showBlackCardContent(ShowStateClient client) {

System.out.println("展示黑卡用户内容");

}

@Override

public void showComeBackContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

}

public class ShowComeBackContentState implements UserState {

@Override

public void showNewContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showVIPContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showPlatinaContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showBlackCardContent(ShowStateClient client) {

System.out.println("用户状态错误");

}

@Override

public void showComeBackContent(ShowStateClient client) {

System.out.println("展示回归用户内容");

}

}

3.定义一个状态使用的client

public class ShowStateClient {

private UserState userState;

public void setUserState(UserState userState){

this.userState = userState;

}

public UserState getUserState(){

return userState;

}

public void showNewContent() {

userState.showNewContent(this);

}

public void showVIPContent() {

userState.showVIPContent(this);

}

public void showPlatinaContent() {

userState.showPlatinaContent(this);

}

public void showBlackCardContent() {

userState.showBlackCardContent(this);

}

public void showComeBackContent() {

userState.showComeBackContent(this);

}

}

4.外部使用

public static void main(String[] args) {

ShowStateClient client = new ShowStateClient();

client.setUserState(new ShowNewContentState());

client.showNewContent();

client.showVIPContent();

client.showPlatinaContent();

client.showBlackCardContent();

client.showComeBackContent();

}

个人觉得状态模式过于臃肿,用处反而没有特别突出,不过也许是我没有遇到合适的场景或者理解有误吧!

标签:语句,void,System,模式,用卫,client,println,ShowStateClient,public

来源: https://www.cnblogs.com/yibeijingdoujiang/p/11393380.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle同步恢复目录,Oracle创建恢复目录(catalog)

Oracle创建恢复目录(catalog),在catalog数据库上创建cat用户的表空间。Oracle创建恢复目录1.在catalog数据库上创建cat用户的表空间SQL> create tablespace cat datafile /home/oracle/oradata/orcl/cat.dbf size 512M;2.创建cat用户SQL> Create user cat ide…

java登录界面命令_Java命令行界面(第3部分):jbock

java登录界面命令在本系列中有关使用Java进行命令行分析的前两篇文章中,我介绍了Apache Commons CLI和args4j库。 在本系列的第三篇文章中,我介绍了jbock ,它是自我描述的“非常简单的CLI解析器”。 我在Java命令行解析中的帖子使用了一些示…

数仓建模 项目_模型设计_数仓建模 PDF 下载

主要内容:数据仓库按照传统的定义,数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。从数据角度,数据仓库更适合传统的数据库,离线采集,数据一般为结构化的。当然…

Linux 命令之 htop -- 互动的进程查看器/查看进程信息

文章目录介绍与 top 的对比常用选项参考示例(一)启动 htop(二)以单色模式启动 htop(三)设置显示更新的延迟为 3 秒(四)显示指定用户的进程介绍 htop 命令是Linux系统中的一个互动的…

java中转json字符串_如何在Java中转义JSON字符串-Eclipse IDE技巧

java中转json字符串在Java应用程序中工作或进行JSON解析时,通常很常见的做法是从某些资源(例如RESTful Web服务)中复制粘贴JSON字符串,然后使用Jackson库解析JSON。 这是在Java中测试和学习解析JSON字符串的最快方法,但…

home oracle c.sql,Infoxmix与Oracle的嵌入式SQLC对比

Infoxmix和Oracle的嵌入式SQL/C开发对比ESQLC和PROC的对比本文档介绍了数据库嵌入式SQL/C语言程序ESQLC和PROC的区别一.基本语法1.语法字符ESQLC中既支持…$?数据库语法,同时也支持“EXEC SQL”,…:?数据库语法PROC中只支持“EX…

spock 集成测试_使用Spock Mocks进行Grails 3.3集成测试

spock 集成测试在Grails单元测试中,可以轻松使用Grails随附的Spock框架来模拟或存根协作者(例如服务)。 “ 测试”一章对模拟协作者, doWithSpring / doWithConfig回调方法,在测试中模拟bean的FreshRuntime批注进行了…

uni开发中可以用table标签么_「uni-app 组件」t-table 表格

table 表格基本使用组件,让你制作简单表格只需要专注内容,而不用过度专注样式。此组件基本全平台支持。(支付宝,百度,头条小程序理论上都支持,但是没有很细致的测试这几个平台)功能亮点自定义全局表格样式自定义局部表…

Linux 命令之 kill -- 杀死进程

文章目录命令介绍语法格式常用选项参考示例(一)列出所有信号的名称(二)杀掉 bash 进程命令介绍 kill 正如这个单词的意思一样,就是杀死。linux 系统中 kill 命令用来删除执行中的程序或工作。 kill 命令用来删除执行…

gwt-2.8.2下载_从GWT开发人员的角度概述Scala.js

gwt-2.8.2下载该博客严重偏向于GWT(和基于GWT的框架),但是我谨记,将来GWT可能会被其他技术取代,因此我们始终愿意探索其他平台/框架。 正如他们所说,多元化可以降低风险。 每种编程语言,即使是最…

Linux 命令之 killall 命令-使用进程的名称来杀死一组进程

文章目录介绍语法格式常用选项参数参考示例介绍 killall 命令使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程。我们可以使用kill命令杀死指定进程 PID 的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用 ps 等命令再配合…

python selenium 点击开始按钮_使用Selenium和Python单击一个按钮

I have the following code:Expand allWhen I click on expand all, the whole page loads. How can I do it using WebDriver for Python?解决方案As per the HTML you can use the find_element_by_link_text and invoke click() method as follows :driver.find_element_by…

COLLATE oracle,Sql 中Collate用法

今天查询sqlite的时候需要不区分大小写,查了下文档,需要使用collate nocase.顺便学习下collate的用法。collate在sql中是用来定义排序规则的。排序规则其实就是当比较两个字符串时,根据某种规则来确定哪个比较大,是否相等。各个数…

Linux 命令之 nslookup 命令-查询域名 DNS 信息的工具

文章目录介绍常用选项参考示例介绍 nslookup命令的英文全称为 “query Internet name server interactively ”。nslookup命令主要用来查询域名的DNS信息。在使用nslookup之前,先确保已经安装了它,nslookup属于bind-utils包下一个命令 。 nslookup有两…

jdeps_JDeps入门–分析项目的依赖关系

jdepsJDeps是Java依赖关系分析工具 ,这是一个命令行工具,它处理Java字节码(意味着.class文件或包含它们的JAR),并分析类之间静态声明的依赖关系。 可以用各种方式过滤结果,并可以将其汇总到包或JAR级别。 J…

extjs5的grid垂直滚动条bug_ExtJS 6.2.1 Classic Grid 滚动条bug解决方案

如果列表同时存在横向滚动条和竖向滚动条,当竖向滚动条滚动到底部时点击横向滚动条,滚动条会自动滚动到顶部此bug未在其他版本发现,参考高版本代码重写类解决此bug,直接上代码:/*** 如果列表同时存在横向滚动条和竖向滚…

禁止linux使用密码ssh,linux centos7服务器使用密钥登录ssh同时禁止root密码登录

这两天在大量的给服务器添加密钥,有的服务器简单绑定下就行了。但是京东云目前就毕竟弱了,得自己手动来。目前京东云的服务器需要自己手动修改配置,才能用密钥登录服务器,不然默认还是root用密码登录。把密钥保存到本地&#xff0…

cloudwatch_将CloudWatch Logs与Cloudhub Mule集成

cloudwatch在此博客中,我将解释如何为您的Mule CloudHub应用程序启用AWS Cloudwatch日志 。 AWS提供了Cloudwatch Logs Services,以便您可以更好地管理日志。 它比松散便宜。 由于cloudhub会自动翻转超过100 MB的日志,因此我们需要一种机制来…

linux 权限 mask,【自学Linux】Linux用户、组、权限(一)

用户、组、权限权限:r,w,x文件:r:可读,可以使用类似cat等命令查看文件内容w:可写,可以编辑或删除此文件x:可执行,eXacutable,可以命令提示符下当中命令提交给内核运行0 000 ---:无权限1 001 --x&#xff1a…

要多大内存才满足_什么是延迟满足能力?“延迟满足”能力对孩子有多重要家长要清楚...

文丨饭饭妈记得去年过春节的时候,家里来了两个亲戚,他们分别有一个小孩,当时大家都在准备年夜饭。其中一份糯米团子准备好放在桌子上之后,亲戚家的两个小孩都非常想要吃,亲戚对孩子说:“你们现在不能吃&…