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

原创 2018年04月15日 20:41:35

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

目录

导航

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

前言

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

抽象状态角色 (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 {
    @Override
    void settingProfile() {
        System.out.println("请设置信息!");
    }

    @Override
    void viewIndex() {

        System.out.println("欢迎进入主页!");
    }
}
/***
 *
 *@Author ChenjunWang
 *@Description:游客状态类,实现游客状态下的方法
 *@Date: Created in 19:20 2018/4/15
 *@Modified By:
 *
 */
public class TouristState extends State {

    @Override
    void settingProfile() {
        System.out.println("您未登陆,请先登陆!");

    }

    @Override
    void 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会回你们的。
觉得写得不错的小伙伴,欢迎转载,但请附上原文地址,谢谢^_^!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/niunai112/article/details/79952625

Android设计模式精解(第10课) :状态模式(State pattern)

-
  • 1970年01月01日 08:00

java 跳一跳辅助实现源码

一个用JAVA实现的微信跳一跳辅助 使用方法 1.安装ADB工具。(若已安装请忽略,若未安装,windows平台可以使用adbTool目录下的platform-tools-latest-windo...
  • niunai112
  • niunai112
  • 2018-01-12 18:14:25
  • 2688

设计模式(十九)责任链模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 目录 目录 导航 前言 例子 总结 优点 缺点 Git地址...
  • niunai112
  • niunai112
  • 2018-04-16 23:32:54
  • 80

设计模式(八)桥接模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 目录 目录 导航 前言 例子 总结 优点 缺点 Git地址...
  • niunai112
  • niunai112
  • 2018-03-24 23:42:39
  • 73

设计模式(九)外观模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 目录 目录 导航 前言 例子 总结 优点 缺点 Git地址...
  • niunai112
  • niunai112
  • 2018-03-26 18:35:50
  • 55

设计模式(十六)命令模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 目录 目录 导航 前言 例子 总结 优点 缺点 Git地址...
  • niunai112
  • niunai112
  • 2018-04-14 21:26:21
  • 42

spring源码学习(三)解析和注册BeanDefinition(上)

spring通过registerBeanDefinitions来解析和注册BeanDefinition。位于XmlDefinitionsReader类中 。...
  • niunai112
  • niunai112
  • 2017-08-25 14:17:22
  • 396

设计模式(一)单例模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 目录 目录 导航 例子 Git地址 导航 设计...
  • niunai112
  • niunai112
  • 2018-03-14 00:14:00
  • 92

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

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 目录 目录 导航 前言 例子 总结 优点 缺点 Git地址...
  • niunai112
  • niunai112
  • 2018-04-15 20:41:35
  • 54

运用单例模式、建造者模式和策略模式实现异步加载Android联系人资料

学完设计模式很久了,最近又在看Android联系人提供程序的官方文档,于是就想实现一个方便的联系人管理程序demo,而联系人管理程序demo的核心就是要实现一个异步加载联系人资料的类,于是就有了下文。...
  • qq_28205153
  • qq_28205153
  • 2016-07-31 11:58:37
  • 620
收藏助手
不良信息举报
您举报文章:设计模式(十七)状态模式
举报原因:
原因补充:

(最多只允许输入30个字)