【设计模式】状态模式实例与代码分析

目录

系列文章目录

装饰者模式实例与代码分析

前言

一、🌍状态(State)模式是什么?🌍

二、🌍状态(State)模式的优缺点🌍

三、🌍状态(State)模式的结构🌍

四、🌍实例演示🌍

1.🌕实例概述🌕

2.🌕代码演示🌕

3.🌕实验结果🌕

总结


系列文章目录

装饰者模式实例与代码分析icon-default.png?t=M4ADhttps://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,客户端错误状态码,服务器无法处理请求]
----------------*****----------------

总结

        以上就是今天要讲的内容,本文仅仅简单介绍了行为模式下状态模式的定义,优缺点以及其的模式结构,并通过实例演示,进一步反应了在一定需求条件下,状态模式的优点。
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值