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


推荐阅读
author-avatar
小新没蜡笔775
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有