作者:小新没蜡笔775 | 来源:互联网 | 2023-10-12 10:15
版权声明:转载必须注明本文转自晓_晨的博客: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 {@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会回你们的。
觉得写得不错的小伙伴,欢迎转载,但请附上原文地址,谢谢^_^!