当前位置: 首页 > wzjs >正文

提供做网站公司有哪些重庆可靠的关键词优化研发

提供做网站公司有哪些,重庆可靠的关键词优化研发,北京哪个网站建设最好,建设银行激活社保卡网站文章目录 简介问题解决代码关键优化点 总结 简介 状态是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。 问题 状态模式与有限状态机的概念紧密相关。 有限状态机的主要思想是程序在任意时刻仅…

文章目录

  • 简介
  • 问题
  • 解决
    • 代码
    • 关键优化点
  • 总结

简介

状态是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。

问题

状态模式与有限状态机的概念紧密相关。
有限状态机
有限状态机的主要思想是程序在任意时刻仅可处于几种有限的状态中。 在任何一个状态中, 程序的行为都不相同, 并且可以瞬间从一个状态切换到 另一个状态。 根据当前状态, 程序可能会切换到另外一种状态, 也可能会保持当前状态不变。 这些数量有限且预先定义的状态切换规则就是状态转移。
你可以把这个方法应用在对象上。 假如你有一个 文档Document类。 文档可能会处于草稿Draft 、 审阅中Moderation和已发布Published三种状态中的一种。 文档的 publish发布方法在不同状态下的行为略有不同:

  1. 处于草稿状态时, 发布方法会把状态转移到审阅中。
  2. 处于审阅中状态时, 如果当前用户是管理员, 发布方法会公开发布文档。
  3. 处于已发布状态时, 它不会进行任何操作。
    文档对象的全部状态和转移
    状态机通常由众多条件运算符 ( if或 switch ) 实现, 可根据对象的当前状态选择相应的行为。 即使你之前从未听说过有限状态机, 你也很可能已经实现过状态模式。 下面的代码应该能帮助你回忆起来。
import java.util.Objects;class Document {private String state = "draft"; // 初始状态为草稿private User currentUser; // 伪代码中的currentUser需要具体实现public void publish() {switch (state) { // 基于状态的条件分支case "draft":state = "moderation";System.out.println("文档进入审核状态");break;case "moderation":if (currentUser != null && "admin".equals(currentUser.getRole())) {state = "published";System.out.println("文档正式发布");}break;case "published":System.out.println("文档已发布,无需操作");break;default:throw new IllegalStateException("非法状态: " + state);}}// User相关类需要自行实现static class User {private final String role;public User(String role) {this.role = role;}public String getRole() {return role;}}// 设置当前用户public void setCurrentUser(User user) {this.currentUser = user;}
}// 使用示例
public class Main {public static void main(String[] args) {Document doc = new Document();// 管理员操作doc.setCurrentUser(new Document.User("admin"));doc.publish(); // Draft → Moderationdoc.publish(); // Moderation → Published// 普通用户操作doc.setCurrentUser(new Document.User("user"));doc.publish(); // 保持Published状态}
}

当我们逐步在文档类中添加更多状态和依赖于状态的行为后, 基于条件语句的状态机就会出问题。 为了能根据当前状态选择相应行为, 绝大部分方法里都会包含复杂的条件语句。 修改转换逻辑可能会涉及到修改所有相关方法中的状态条件语句, 加大代码的维护难度。
这个问题会随着项目进行变得越发严重。 因为我们很难在设计阶段预测到所有可能的状态和转换。 随着时间推移, 最初只包含有限条件语句的简洁状态机可能会变得非常臃肿。

解决

状态模式建议为所有可能状态都新建一个对应的类,然后把该状态的对应行为抽取到类中。
原始对象被称为上下文(con­text),它并不会自行实现所有行为,而是会保存一个指向当前状态对象的引用,把所有跟状态相关的工作委派给这个对象。
文档将工作委派给一个状态对象
如果需要把上下文转换成另外一种状态,就需要把当前引用的状态对象替换成另外一个新状态对象。当然采用这种方式是有前提的:所有状态类都必须遵循同样的接口,而且上下文必须只通过接口与这些状态对象进行交互。
这个结构可能看上去跟策略模式有点像,但有一个关键性的不同——在状态模式里,特定状态知道其他所有状态的存在,能触发从一个状态到另一个状态的转换;而策略几乎完全不知道其他策略的存在。

代码

// Context 类
class Document {private DocumentState currentState;private String currentUserRole;public Document() {this.currentState = new DraftState();  // 初始化为草稿状态}// 设置当前用户角色public void setCurrentUserRole(String role) {this.currentUserRole = role;}// 状态转移方法void transitionTo(DocumentState state) {  // 支持状态自我转换this.currentState = state;}// 发布入口方法public void publish() {currentState.handlePublish(this);  // 委托给当前状态处理}
}// State 接口
interface DocumentState {void handlePublish(Document context);  // 参数传递上下文引用
}// 具体状态实现
class DraftState implements DocumentState {@Overridepublic void handlePublish(Document doc) {  // 草稿状态转审核System.out.println("提交文档进入审核状态");doc.transitionTo(new ModerationState());  // 状态自我转换}
}class ModerationState implements DocumentState {@Overridepublic void handlePublish(Document doc) {  // 根据管理员权限处理if ("admin".equals(doc.currentUserRole)) {  // 获取上下文中的角色信息System.out.println("管理员发布文档");doc.transitionTo(new PublishedState());} else {System.out.println("非管理员无法发布");}}
}class PublishedState implements DocumentState {@Overridepublic void handlePublish(Document doc) {  // 终态不处理System.out.println("文档已发布,无法重复操作");}
}// Client(客户端)
public class Client {public static void main(String[] args) {Document doc = new Document();// 测试普通用户场景doc.setCurrentUserRole("user");doc.publish();  // Draft → Moderationdoc.publish();  // 保持Moderation// 测试管理员场景doc.setCurrentUserRole("admin");doc.publish();  // Moderation → Published// 检查终态稳定性doc.publish();  // 保持Published状态}
}

关键优化点

  1. 状态自管理:每个具体状态类自行控制下一步状态转换
  2. 上下文访问:通过传递文档引用获取当前用户角色(简化私有字段访问)
  3. 可扩展性:新增状态只需创建类并实现接口,无需修改现有代码
  4. 消除条件逻辑:完全移除switch/case结构,使用多态分发

总结

在这里插入图片描述

  1. 上下文(Con­text)保存了对于一个具体状态对象的引用,会把所有跟这个状态相关的工作委派给它。上下文通过状态接口和状态对象交互,并且会提供一个设置器用于传递新的状态对象。
  2. 状态(State)接口会声明特定于状态的方法。这些方法能被其他所有具体状态所理解及调用。
  3. 具体状态(Con­crete States)会自行实现特定于状态的方法。为了避免多个状态中包含相似代码,你可以提供一个封装有部分通用行为的中间抽象类。
    另外,状态对象可存储对于上下文对象的反向引用。状态可以通过这个引用从上下文里获取所需信息,并且能触发状态转移。
  4. 上下文和具体状态都可以设置上下文的下个状态,并可以通过替换连接到上下文的状态对象来完成实际的状态转换。
http://www.dtcms.com/wzjs/147405.html

相关文章:

  • 网页css样式代码株洲企业seo优化
  • 做网站要怎样加盟欧普google入口
  • 响应式网站应该怎么做seo技术培训东莞
  • 不通过网站可以做360全景吗什么是百度竞价推广
  • 为什么有网网站打不开怎么回事啊如何找外链资源
  • 襄城县做网站的seo公司重庆
  • 行业论坛网站昆明百度推广开户费用
  • 做网站的多少钱外链吧官网
  • 做网站要源代码app推广80元一单
  • 网站语言切换功能如何做重庆seo霸屏
  • 建设工程质量监督竣工备案网站长沙市seo百度关键词
  • 莲湖微网站建设郑州seo竞价
  • 做网站卖设备找哪家好站内搜索工具
  • 做t恤网站 一件也可以做搜索引擎下载入口
  • 华为官方网站专卖店上海最新疫情
  • win2008网站404seo推广代理
  • 做品牌网站的链接优化方法
  • 安徽全过程网站搭建案例代写新闻稿
  • 石家庄市栾城区建设局网站360推广和百度推广哪个好
  • 怎么做网站才能吸引人韩国日本比分
  • 网站建设续费是什么费用体育新闻最新消息
  • 建设法规的网站湖南网站推广优化
  • 360网站页面的工具栏怎么做中国最好的营销策划公司
  • 网站改版后新版前台如何跟旧版后台链接企业文化理念
  • 西安做网站公司高质量网站外链平台
  • 用wordpress做开发郑州seo推广外包
  • 学做粤菜的网站深圳信息公司做关键词
  • 国内人做韩国网站一般都卖什么广州网站seo地址
  • 网站服务器做哪些安全措施软文推广发稿平台
  • 网站行业新闻怎么做网上在线看视频为什么卡