设计模式中的撩妹神技--下篇

简介:      开篇前言 遇一人白首,择一城终老,是多么美好的人生境界,她和他历经风雨慢慢变老,回首走过的点点滴滴,依然清楚的记得当初爱情萌芽的模样,时维十一月,眼看着光棍节就那么轻轻的来了,没有预告,没有准备`(*∩_∩*)′,是否想在双十一摆脱单身,和亲爱的ta牵手漫步,在寒风中紧紧相拥,都说艺术来源于生活,却高于生活,作为人类智慧的结晶设计模式,她蕴藏着丰富的撩妹技术,今天这篇博文,小编主要介绍状态模式中的撩妹神技。

     开篇前言

遇一人白首,择一城终老,是多么美好的人生境界,她和他历经风雨慢慢变老,回首走过的点点滴滴,依然清楚的记得当初爱情萌芽的模样,时维十一月,眼看着光棍节就那么轻轻的来了,没有预告,没有准备`(*∩_∩*)′,是否想在双十一摆脱单身,和亲爱的ta牵手漫步,在寒风中紧紧相拥,都说艺术来源于生活,却高于生活,作为人类智慧的结晶设计模式,她蕴藏着丰富的撩妹技术,今天这篇博文,小编主要介绍状态模式中的撩妹神技。

       什么是状态模式

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类,状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化,一句话来说就是,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类,我们来看一下状态模式的结构图,如下所示:


状态模式中的撩妹神技

新建项目State,新建类和类MM、Boy,编写相关的代码部分,如下所示:

package com.dp.state;

public class MM {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	

}
Boy的代码如下所示:

package com.dp.state;

public class Boy {
	
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}
小伙伴们都知道MM的状态是非常不固定的,恰似六月的天,像娃娃的脸,说变就变,MM是个易变得动物,前一个月还海誓山盟,后一个月擦肩而过,形同陌路,作为MM来讲,她会有一些方法,会哭、会笑、会说,编写代码,如下所示:
package com.dp.state;

public class MM {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	

	public void smile(){
		
	}
	
	public void cry(){
		
	}
	
	public void say(){
		
	}
}
MM在不同状态的时候,这些方法的实现是不相同的,状态决定方法该如何执行。这个时候我们就可以疯传一个state,新建类MMState,代码如下所示:
package com.dp.state;

public abstract class MMState {
	public abstract void smile();
	public abstract void cry();
	public abstract void say();
}
MMState这个类有一些具体的子类,比如haapy的状态,如下所示:

package com.dp.state;

public class MMHappyState extends MMState {

	@Override
	public void smile() {
		// TODO Auto-generated method stub

	}

	@Override
	public void cry() {
		// TODO Auto-generated method stub

	}

	@Override
	public void say() {
		// TODO Auto-generated method stub

	}

}
MM还可以有unHappy的状态,编写代码如下所示:

package com.dp.state;

public class MMUnHappyState extends MMState {

	@Override
	public void smile() {
		// TODO Auto-generated method stub

	}

	@Override
	public void cry() {
		// TODO Auto-generated method stub

	}

	@Override
	public void say() {
		// TODO Auto-generated method stub

	}

}
这个时候MM的代码就可以这样来编写,如下所示:

package com.dp.state;

public class MM {
	private String name;
	
	private MMState state = new MMHappyState();

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	

	public void smile(){
		state.smile();
	}
	
	public void cry(){
		state.cry();
	}
	
	public void say(){
		state.say();
	}
}
这就是State模式,设计模式的区别往往是在语义上,而不是在语法上,接着我们来看一下状态模式的优缺点。

状态模式的优缺点

优点:

a、封装了转换规则。

b、枚举可能的状态,在枚举状态之前需要确定状态种类。 

c、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 

d、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 

e、 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
缺点:

a、状态模式的使用必然会增加系统类和对象的个数。 

b、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。 

c、状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。
    状态模式的应用场景

a、当一个对象状态转换的条件表达式过于复杂时可以使用状态者模式。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简单化。
b、当一个对象行为取决于它的状态,并且它需要在运行时刻根据状态改变它的行为时,就可以考虑使用状态者模式。

小编寄语:该博文小编主要介绍了设计模式中的撩妹神技之状态模式,小编从什么是状态模式、状态模式的结构图,撩妹的Demo,状态模式的优缺点以及状态模式的优缺点,不知道单身的你,有没有从小编的系列博客中受到启发呢,双十一在即,单身的你,还在等什么,赶紧行动吧`(*∩_∩*)′,或许就在你读完小编博文的时候,你和ta在转角的咖啡屋不期而遇,面对眼前的这个人,ta淡雅如风,你笑魇如花......

目录
相关文章
|
数据挖掘 计算机视觉 Python
学生考试数据分析
学生考试数据分析
269 1
|
消息中间件 Cloud Native Serverless
RocketMQ 事件驱动:云时代的事件驱动的不同
本文深入探讨了云时代 EDA 的新内涵及它在云时代再次流行的主要驱动力,包括技术驱动力和商业驱动力,随后重点介绍了 RocketMQ 5.0 推出的子产品 EventBridge,并通过几个云时代事件驱动的典型案例,进一步叙述了云时代事件驱动的常见场景和最佳实践。
247903 128
RocketMQ 事件驱动:云时代的事件驱动的不同
|
SQL Java 数据库连接
JDBCTEMPLATE 的基本使用----查询操作26
JDBCTEMPLATE 的基本使用----查询操作26
JDBCTEMPLATE 的基本使用----查询操作26
|
机器学习/深度学习 算法 数据挖掘
深度学习面试问题目录 | 深度学习目标检测、语义分割、分类上百种面试问答技巧
这篇文章汇总了深度学习面试,特别是目标检测领域的常见问题,提供了一个详细的目录大纲,便于读者直接跳转至答案。通过理解和解答这些问题,求职者能展示其在深度学习专业的知识、解决问题的能力及对应用的理解,从而提高面试成功率和竞争力。包含多个专题,如损失函数、Python解释器、经典网络、YOLO系列、激活函数等。
|
JavaScript 前端开发
构建工具:配置Webpack打包Vue项目
【4月更文挑战第24天】本文介绍了如何配置Webpack来打包Vue项目。首先,Webpack作为模块打包器处理依赖并打包成可执行文件。接着,通过安装Node.js和npm,创建Vue项目,进入项目目录并配置Webpack的入口、输出、加载器和插件。最后,运行构建命令完成打包。理解Webpack基础并按需配置,能优化前端项目构建和开发体验。
271 0
|
消息中间件 SQL 关系型数据库
go-zero微服务实战系列(十、分布式事务如何实现)
go-zero微服务实战系列(十、分布式事务如何实现)
|
机器学习/深度学习 人工智能 并行计算
AI风口,算力无忧!
随着AI/ML技术的快速发展,各行各业在实际的应用场景中对计算资源的需求量越来越大,各大云厂商也是积极部署其IaaS资源,其中GPU是加速计算中最为关键需求之一。笔者将从新手体验性的使用到进阶体验,带领大家快速使用阿里云GPU云服务器,体验官方提供的八大场景。在后续的进阶体验中,教大家构建自己的大语言模型,如ChatGLM-6B。
21470 19
AI风口,算力无忧!
|
Java 关系型数据库 数据库连接
MyBatis-Plus全套笔记一
MyBatis-Plus全套笔记一
380 1
|
资源调度 运维 监控
带你读《2022龙蜥社区全景白皮书》——6.1.3 资源混部场景的内核隔离实现方案(下)
带你读《2022龙蜥社区全景白皮书》——6.1.3 资源混部场景的内核隔离实现方案(下)
517 104
|
弹性计算 Linux
(已解决) centos6.5 yum源 失效 The whole CentOS 6 is dead and shouldn’t be used anywhere at all
(已解决) centos6.5 yum源 失效 The whole CentOS 6 is dead and shouldn’t be used anywhere at all
543 0