JAVA 设计模式 状态模式

用途

状态模式 (State)

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

状态模式是一种行为型模式

结构

图-状态模式结构图

State : 定义一个接口以封装与 Context 的一个特定状态相关的行为。

abstract class State {
 public abstract void Handle(Context context);
 }

ConcreteState : 每一个子类实现一个与 Context 的一个状态相关的行为。

class ConcreteStateA extends State {
     @Override
 public void Handle(Context context) {
         context.SetState(new ConcreteStateB());
     }
 }
 
 class ConcreteStateB extends State {
     @Override
 public void Handle(Context context) {
         context.SetState(new ConcreteStateA());
     }
 }

Context : 维护一个 ConcreteState 子类的实例,这个实例定义当前的状态。

class Context {
 private State state;
 public Context(State state) {
 this.state = state;
     }
 
 public void SetState(State state) {
 this.state = state;
         System.out.println("当前状态:" + state.getClass().getName());
     }
 public State GetState() {
 return state;
     }
 
 public void Request() {
         state.Handle(this);
     }
 }

测试代码

public class StatePattern {
 public static void main(String[] args) {
         Context c = new Context(new ConcreteStateA());
         c.Request();
         c.Request();
     }
 }

运行结果

当前状态:ConcreteStateB
当前状态:ConcreteStateA

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》《HeadFirst设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员叨叨叨

Andorid自定义控件属性值设置

今天写一个简单的自定义控件,实现宽固定,高度根据自定义宽高比例自动调整;或高固定,宽度随比例调整。其中有一个 solid属性,想要像android:layout...

802
来自专栏糊一笑

移动端效果之IndexList

写在前面 接着前面的移动端效果讲,这次讲解的的是IndexList的实现原理。效果如下: ? 代码请看这里:github 移动端效果之swiper 移动端效果之...

2034
来自专栏MelonTeam专栏

深入了解layout_weight的用途

导语 :当需要某个View自动占满剩余空间,或者多个View平分空间时,你会想到使用layout_weight,但如果想按比例使用空间, 你会怎么用呢,又有什么...

1838
来自专栏移动开发的那些事儿

自定义实现垂直滚动的TextView

通过控制y参数可实现文字不同的垂直距离,这里的x,y并不代表默认横向坐标为0,纵向坐标为0的坐标,具体详解我觉得这篇博客解释的比较清楚,我们主要关注的是参数y的...

962
来自专栏HTML5学堂

2016.06 第三周 群问题分享

HTML+CSS 怎么让一个容器里面不管存在2个子元素还是1个子元素都能垂直居中 2016.06.20~2016.06.24 核心内容 弹性布局 参考答案 实例...

2939
来自专栏懒人开发

鸿洋AutoLayout代码分析(五):Attr相关类

上一节,我们分析了很多类, 其中,最重要的是 AutoLayoutHelper 类的2个方法 adjustChildren() 和 getAutoLayou...

903
来自专栏老码农专栏

ActFramework r1.2.0 带来的新特性

893
来自专栏应用案例

一行代码搞定SwipeRefreshLayout拦截事件

SwipeRefreshLayout这个控件大家可能几百年前就已经在熟练使用了,相关的博客也多不胜数,方法也许不同,但实质都是一样的,写这个的目的也只是为了先把...

2119
来自专栏一直在跳坑然后爬坑

仿联系人列表页的轮子GroupingViewSample

制作类似联系人页面所需要的Slider,还有用来给recyclerview进行分组的ItemDecoration,我觉得最实用的地方是可以用xml来画对应部分的...

601
来自专栏微信公众号:Java团长

SpringMVC常用注解标签详解

在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一...

832

扫码关注云+社区