目录
系列文章目录
装饰者模式实例与代码分析
https://mp.csdn.net/mp_blog/creation/editor/124814225
前言
设计模式,又称为软件设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。学习设计模式可以提高程序员的思维能力、编程能力和设计能力,使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
一、🌍状态(State)模式是什么?🌍
对于有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
二、🌍状态(State)模式的优缺点🌍
优点:
1)状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”;
2)减少对象间的相互依赖。将不同的状态引入到独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖;
3)有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。
缺点:
1)状态模式的使用必然会增加系统的类与对象的个数;
2)状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。
三、🌍状态(State)模式的结构🌍
状态模式包含以下主要角色:
⑴ 环境(Context)角色:也称为上下文,它定义了客户感兴趣的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理。
⑵ 抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为。
⑶ 具体状态(ConcreteState)角色:实现抽象状态所对应的行为。
四、🌍实例演示🌍
1.🌕实例概述🌕
环境角色:
Browser类,向Service发送请求,得到的状态码。
抽象状态角色:
HttpState类,封装特定状态对应的方法。
具体状态角色:
SuccessState、SuccessState、RequestTooLargeState类,在类里面进行逻辑处理。
2.🌕代码演示🌕
话不多说,代码附上!
package State;
import java.util.regex.Pattern;
public class ServiceState {
public static void main(String[] args) {
// TODO Auto-generated method stub
//新建一个浏览器,用于向服务器发送请求
Browser browser = new Browser();
//发送请求
browser.Request("https://www.hao123.com");
//输出返回给浏览器的状态码
System.out.println("[Url:" + browser.getState().url + "\n State:" +
browser.getState().stateName + "]");
System.out.println("----------------*****----------------");
//发送请求2
browser.Request("www.hao123.com/123.html");
System.out.println("[Url:" + browser.getState().url + "\n State:" +
browser.getState().stateName + "]");
System.out.println("----------------*****----------------");
//发送请求3
browser.Request("www.hao123.com/dy/article/H8NSPLOS0534A4S1.html");
System.out.println("[Url:" + browser.getState().url + "\n State:" +
browser.getState().stateName + "]");
System.out.println("----------------*****----------------");
//发送请求4
browser.Request("www.hao123.com/dy/article/");
System.out.println("[Url:" + browser.getState().url + "\n State:" +
browser.getState().stateName + "]");
System.out.println("----------------*****----------------");
}
}
//环境类:Browser,向Service发送请求,得到的状态码
class Browser
{
//绑定状态
private HttpState state;
//初始化一个状态
Browser(){
state = new BadRequestState(this);
}
//在具体状态类里面调用,改变状态
public void setState(HttpState state)
{
this.state=state;
}
//通过成员变量拿到状态的信息
public HttpState getState()
{
return state;
}
//封装方法
public void Request(String url)
{
state.Request(url);
}
}
//抽象状态类:HttpState类
abstract class HttpState
{
protected Browser browser; //环境
protected String stateName; //状态名
protected String url; //请求网址
//构造的一个识别URL的正则表达式
Pattern pattern = Pattern.compile("((https|http|ftp|rtsp|mms):/{2})?www.[a-z0-9]{1,}.(com|cn)(/[a-z0-9]{1,}(.[a-z]{1,})*){0,}");
public abstract void Receive(); //服务器接受检查处理
public void Request(String url) {
this.url = url;
Receive();
}
}
//具体状态类:200Success
class SuccessState extends HttpState
{
public SuccessState(HttpState state)
{
browser = state.browser;
stateName = "200,成功,操作被成功接收并处理";
url = state.url;
}
public void Receive()
{
if(url.length() > 30) {
browser.setState(new RequestTooLargeState(this));
}
else if(!pattern.matcher(url).matches()) {
browser.setState(new BadRequestState(this));
}
}
}
//具体状态类:400,客户端错误状态码,服务器无法处理请求
class BadRequestState extends HttpState
{
public BadRequestState(Browser browser) {
this.browser = browser;
stateName = "400,客户端错误状态码,服务器无法处理请求";
url = "www.tjufe.edu.cn";
}
public BadRequestState(HttpState state)
{
browser = state.browser;
stateName = "400,客户端错误状态码,服务器无法处理请求";
url = state.url;
}
public void Receive()
{
if(url.length() > 30) {
browser.setState(new RequestTooLargeState(this));
}
else if(pattern.matcher(url).matches()) {
browser.setState(new SuccessState(this));
}
}
}
//具体状态类:414,请求的URI过长(URI通常为网址),服务器无法处理
class RequestTooLargeState extends HttpState
{
public RequestTooLargeState(HttpState state)
{
browser = state.browser;
stateName = "414,请求的URL过长,服务器无法处理";
url = state.url;
}
public void Receive()
{
if(pattern.matcher(url).matches()) {
browser.setState(new SuccessState(this));
}
else if(url.length()<=30) {
browser.setState(new BadRequestState(this));
}
}
}
3.🌕实验结果🌕
[Url:https://www.hao123.com
State:200,成功,操作被成功接收并处理]
----------------*****----------------
[Url:www.hao123.com/123.html
State:200,成功,操作被成功接收并处理]
----------------*****----------------
[Url:www.hao123.com/dy/article/H8NSPLOS0534A4S1.html
State:414,请求的URL过长,服务器无法处理]
----------------*****----------------
[Url:www.hao123.com/dy/article/
State:400,客户端错误状态码,服务器无法处理请求]
----------------*****----------------
总结
以上就是今天要讲的内容,本文仅仅简单介绍了行为模式下状态模式的定义,优缺点以及其的模式结构,并通过实例演示,进一步反应了在一定需求条件下,状态模式的优点。