热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式(十七)状态模式

版权声明:转载必须注明本文转自晓_晨的博客:http:blog.csdn.netniunai112目录目录导航前言例子总结优点缺点Git地址导航设计模

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112

目录

    • 目录
    • 导航
    • 前言
    • 例子
    • 总结
      • 优点
      • 缺点
    • Git地址



导航

设计模式之六大设计原则
设计模式(一)单例模式
设计模式(二)工厂模式
设计模式(三)策略模式
设计模式(四)适配器模式
设计模式(五)享元模式
设计模式(六)建造者模式
设计模式(七)原型模式
设计模式(八)桥接模式
设计模式(九)外观模式
设计模式(十)组合模式
设计模式(十一)装饰器模式
设计模式(十二)代理模式
设计模式(十三)迭代器模式
设计模式(十四)观察者模式
设计模式(十五)中介者模式
设计模式(十六)命令模式
设计模式(十七)状态模式
设计模式(十八)访问者模式
设计模式(十九)责任链模式
设计模式(二十)解释器模式
设计模式(二十一)备忘录模式
设计模式(二十二)模板模式
设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)


前言

状态模式:允许一个对象在其内部状态改变时改变它的行为,类的行为是基于它的状态改变的。状态模式是一种对象行为型模式。

抽象状态角色 (State):接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换。

具体状态角色 (ConcreteState):具体状态类,实现了State中的抽象方法。

环境角色 (Context):定义客户端需要的接口,并且负责具体状态的切换。


例子

LZ已网页登陆为例子,当你浏览一个网页的时候,在你没登陆的时候是未登录状态,在你登陆以后是登陆状态,在这两种状态下,你想进入个人设置的页面的结果肯定是不一样的,这个例子用状态模式可以很好的解决。


/*****@Author ChenjunWang*@Description:状态抽象类,列出受状态影响的方法*@Date: Created in 19:10 2018/4/15*@Modified By:**/
public abstract class State {abstract void settingProfile();abstract void viewIndex();
}/*****@Author ChenjunWang*@Description:登陆状态,实现登陆状态下的方法*@Date: Created in 19:16 2018/4/15*@Modified By:**/
public class LoginState extends State {@Overridevoid settingProfile() {System.out.println("请设置信息!");}@Overridevoid viewIndex() {System.out.println("欢迎进入主页!");}
}
/*****@Author ChenjunWang*@Description:游客状态类,实现游客状态下的方法*@Date: Created in 19:20 2018/4/15*@Modified By:**/
public class TouristState extends State {@Overridevoid settingProfile() {System.out.println("您未登陆,请先登陆!");}@Overridevoid viewIndex() {System.out.println("欢迎进入主页!");}
}
/*****@Author ChenjunWang*@Description:环境角色,定义用户所需要的接口,负责状态切换*@Date: Created in 19:10 2018/4/15*@Modified By:**/
public class Context {private State state;public static final State LOGIN_STATE = new LoginState();public static final State TOURIST_STATE = new TouristState();public void setState(State state) {this.state = state;}public void settingProfile(){state.settingProfile();}public void viewIndex(){state.viewIndex();}
}/*****@Author ChenjunWang*@Description:测试类*@Date: Created in 23:44 2018/4/14*@Modified By:**/
public class Test {public static void main(String[] args) {Context context = new Context();System.out.println("-----------------------一开始,游客状态,未登录-----------------------");context.setState(Context.TOURIST_STATE);context.viewIndex();context.settingProfile();System.out.println("-----------------------进入登陆页面,登陆后-----------------------");context.setState(Context.LOGIN_STATE);context.viewIndex();context.settingProfile();}}运行结构如下
-------------------------------------------------------------------------------
-----------------------一开始,游客状态,未登录-----------------------
欢迎进入主页!
您未登陆,请先登陆!
-----------------------进入登陆页面,登陆后-----------------------
欢迎进入主页!
请设置信息!

若不用状态模式,我们的代码可能是下面这样的。嗯……具体的例子就不写了,LZ相信大家看到下面的代码肯定有似曾相识的感觉。

if (state.equals("登陆")){做登陆逻辑
} else {做没登陆的逻辑
}

使用状态模式可以让不同状态的代码解耦,不会杂糅在一起,无论增删改都得动逻辑的类。


总结


优点

(1)避免了过多的swith…case 或者if..else 语句的使用
(2)使用体现了开闭原则和单一职责原则,每个状态都是一个子类,你要增加状态那就增加子类。


缺点

(1)假如状态很多,那你的类的数量将会膨胀。


Git地址

本篇实例Github地址:https://github.com/stackisok/Design-Pattern/tree/master/src/state


回到最上方




有什么不懂或者不对的地方,欢迎留言。
喜欢LZ文章的小伙伴们,可以关注一波,也可以留言,LZ会回你们的。
觉得写得不错的小伙伴,欢迎转载,但请附上原文地址,谢谢^_^!


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
author-avatar
小新没蜡笔775
这个家伙很懒,什么也没留下!