JAVA设计模式之【状态模式】
状态模式
水、固态、气态、液态
账户、正常状态、透支状态、受限状态
状态模式中,用一个状态类来分散冗长的条件语句,让系统有灵活性和可扩展性
状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题
角色
环境类Context
拥有多种状态的对象
抽象状态类State
定义一个接口来封装与环境类的一个特定状态相关的行为,相同的方法写在抽象状态类中
具体状态类ConcreteState
实现与环境类的一个状态相关的行为
状态转换方式
由环境类来充当状态管理器角色
由具体状态类来负责状态之间的转换
看例子
1.环境类,注册用户
package State;
/**
* Created by Jiqing on 2016/10/29.
*/
public class ForumAccount {
private AbstractState state;
private String name;
public ForumAccount(String name)
{
this.name=name;
this.state=new PrimaryState(this);
System.out.println(this.name + "注册成功!");
System.out.println("---------------------------------------------");
}
public void setState(AbstractState state)
{
this.state=state;
}
public AbstractState getState()
{
return this.state;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public void downloadFile(int score)
{
state.downloadFile(score);
}
public void writeNote(int score)
{
state.writeNote(score);
}
public void replyNote(int score)
{
state.replyNote(score);
}
}
2.抽象状态类
package State;
/**
* Created by Jiqing on 2016/10/29.
*/
public abstract class AbstractState
{
protected ForumAccount acc;
protected int point;
protected String stateName;
public abstract void checkState(int score);
public void downloadFile(int score)
{
System.out.println(acc.getName() + "下载文件,扣除" + score + "积分。");
this.point-=score;
checkState(score);
System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
}
public void writeNote(int score)
{
System.out.println(acc.getName() + "发布留言" + ",增加" + score + "积分。");
this.point+=score;
checkState(score);
System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
}
public void replyNote(int score)
{
System.out.println(acc.getName() + "回复留言,增加" + score + "积分。");
this.point+=score;
checkState(score);
System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
}
public void setPoint(int point) {
this.point = point;
}
public int getPoint() {
return (this.point);
}
public void setStateName(String stateName) {
this.stateName = stateName;
}
public String getStateName() {
return (this.stateName);
}
}
3.具体状态类
package State;
/**
* Created by Jiqing on 2016/10/29.
*/
public class HighState extends AbstractState
{
public HighState(AbstractState state)
{
this.acc=state.acc;
this.point=state.getPoint();
this.stateName="专家";
}
public void writeNote(int score)
{
System.out.println(acc.getName() + "发布留言" + ",增加" + score + "*2个积分。");
this.point+=score*2;
checkState(score);
System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
}
public void downloadFile(int score)
{
System.out.println(acc.getName() + "下载文件,扣除" + score + "/2积分。");
this.point-=score/2;
checkState(score);
System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。"); }
public void checkState(int score)
{
if(point<0)
{
System.out.println("余额不足,文件下载失败!");
this.point+=score;
}
else if(point<=100)
{
acc.setState(new PrimaryState(this));
}
else if(point<=1000)
{
acc.setState(new MiddleState(this));
}
}
}
package State;
/**
* Created by Jiqing on 2016/10/29.
*/
public class MiddleState extends AbstractState
{
public MiddleState(AbstractState state)
{
this.acc=state.acc;
this.point=state.getPoint();
this.stateName="高手";
}
public void writeNote(int score)
{
System.out.println(acc.getName() + "发布留言" + ",增加" + score + "*2个积分。");
this.point+=score*2;
checkState(score);
System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
}
public void checkState(int score)
{
if(point>=1000)
{
acc.setState(new HighState(this));
}
else if(point<0)
{
System.out.println("余额不足,文件下载失败!");
this.point+=score;
}
else if(point<=100)
{
acc.setState(new PrimaryState(this));
}
}
}
package State;
/**
* Created by Jiqing on 2016/10/29.
*/
public class PrimaryState extends AbstractState{
public PrimaryState(AbstractState state)
{
this.acc=state.acc;
this.point=state.getPoint();
this.stateName="新手";
}
public PrimaryState(ForumAccount acc)
{
this.point=0;
this.acc=acc;
this.stateName="新手";
}
public void downloadFile(int score)
{
System.out.println("对不起," + acc.getName() + ",您没有下载文件的权限!");
}
public void checkState(int score)
{
if(point>=1000)
{
acc.setState(new HighState(this));
}
else if(point>=100)
{
acc.setState(new MiddleState(this));
}
}
}
4.客户端执行
package State;
/**
* Created by Jiqing on 2016/10/29.
*/
public class Client
{
public static void main(String args[])
{
ForumAccount account=new ForumAccount("张三");
account.writeNote(20);
System.out.println("--------------------------------------");
account.downloadFile(20);
System.out.println("--------------------------------------");
account.replyNote(100);
System.out.println("--------------------------------------");
account.writeNote(40);
System.out.println("--------------------------------------");
account.downloadFile(80);
System.out.println("--------------------------------------");
account.downloadFile(150);
System.out.println("--------------------------------------");
account.writeNote(1000);
System.out.println("--------------------------------------");
account.downloadFile(80);
System.out.println("--------------------------------------");
}
}
执行结果:
张三注册成功!
---------------------------------------------
张三发布留言,增加20积分。
剩余积分为:20,当前级别为:新手。
--------------------------------------
对不起,张三,您没有下载文件的权限!
--------------------------------------
张三回复留言,增加100积分。
剩余积分为:120,当前级别为:高手。
--------------------------------------
张三发布留言,增加40*2个积分。
剩余积分为:200,当前级别为:高手。
--------------------------------------
张三下载文件,扣除80积分。
剩余积分为:120,当前级别为:高手。
--------------------------------------
张三下载文件,扣除150积分。
余额不足,文件下载失败!
剩余积分为:120,当前级别为:高手。
--------------------------------------
张三发布留言,增加1000*2个积分。
剩余积分为:2120,当前级别为:专家。
--------------------------------------
张三下载文件,扣除80/2积分。
剩余积分为:2080,当前级别为:专家。
--------------------------------------
看关系图

JAVA设计模式之【状态模式】的更多相关文章
- 折腾Java设计模式之状态模式
原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...
- JAVA设计模式--State(状态模式)
状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要 ...
- JAVA设计模式:状态模式
声明:转载请说明来源:http://www.cnblogs.com/pony1223/p/7518226.html 一.引出状态模式 假设我们现在有一个糖果机项目,那么我们知道正常一般糖果机提供给用户 ...
- Java设计模式之状态模式详解
(本文由言念小文原创,转载请注明出处) 在实际工作中经常遇到某个对象,处于不同的状态有不同行为逻辑.且状态之间可以相互迁移的业务场景,特别是在开发通信协议栈类软件中尤为多见.<设计模式之禅> ...
- java设计模式之状态模式
状态模式 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 状态模式UML图 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关 ...
- 曾侯乙编钟引发的遐想之Java设计模式:状态模式
目录 示例 简单例子 改进代码 状态模式 定义 意图 主要解决问题 何时使用 优缺点 曾侯乙编钟 状态模式-命令模式-策略模式 示例 一个类对外提供了多个行为,同时该类对象有多种状态,不同状态下对外的 ...
- 折腾Java设计模式之备忘录模式
原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...
- 折腾Java设计模式之访问者模式
博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...
- 折腾Java设计模式之命令模式
博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...
- JAVA 设计模式之原型模式
目录 JAVA 设计模式之原型模式 简介 Java实现 1.浅拷贝 2.深拷贝 优缺点说明 1.优点 2.缺点 JAVA 设计模式之原型模式 简介 原型模式是六种创建型设计模式之一,主要应用于创建相同 ...
随机推荐
- python中黏包现象
#黏包:发送端发送数据,接收端不知道应如何去接收造成的一种数据混乱现象. #关于分包和黏包: #黏包:发送端发送两个字符串"hello"和"word",接收方却 ...
- Winform WPF 窗体显示位置
WinForm 窗体显示位置 窗体显示的位置首先由窗体的StartPosition决定,FormStartPosition这个枚举值由如下几种情况 // 摘要: // 窗体的位置由 System.Wi ...
- 自定义view 之多个引导层动画效果
SupernatantView 如果我英文还可以的话这个应该叫做漂浮在上层的view---引导层 今天闲来无事看了网上的一些引导层案例总感觉如果不是很舒服,就是类似于很死板的显示和消失 我在想能不能弄 ...
- Python笔记(28)-----继承
来自https://blog.csdn.net/sunwukong_hadoop/article/details/80175292 1.Python的继承以及调用父类成员 python子类调用父类成员 ...
- Python数据分析3------数据预处理(2)----字符串处理
- python matplotlib数据可视化
#基于python3 Matplotlib构建的3D图形: 使用pycharm的小伙伴把sciview给关掉: 因为sciview显示的是png图片.3d图形一般我们都需要拖拖拽拽的. 参见: htt ...
- CSS布局总结(三)
前言:今天学的有点少,主要是有点迷.... 这是昨天没写的 一.水平居中 .parent{ text-aglin:center; } .child{ display:inline-block; } . ...
- CF343E Pumping Stations(最小割树)
没学过最小割树的出门左转. 我们已经知道了两点的最小割就是最小割树上,对应两点之间路径的权值的最小值. 找到最小割树中权值的最小的边. 那么一定是先选完一侧的点在选完另一侧的点. 因为当前边最小,那么 ...
- v4l2程序实例
#include <stdio.h> #include <string.h> #include <errno.h> #include <stdlib.h> ...
- MVC总结
一.转自https://zhuanlan.zhihu.com/p/35680070 MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来, ...