使用状态模式实现计算器
来源:互联网 发布:郑和 知乎 编辑:程序博客网 时间:2024/06/05 03:06
一、代码介绍
大一的时候进入实验室的第一个暑假,在实验室大学长留给我们的第一个作业就是实现一个计算器。
要求是:尽可能使用面对对象的思想去组织后台代码。
当时我们每3、4个人一个小组,有的用asp.net的,有用jsp的,有用php的,我们用的是silverlight。不管用哪种语言,最后检查作业的时候每个小组代码都是被大学长各种嫌弃,当然我们组是被嫌弃的最严重的,就我们小组是用完全面对过程的思想实现的。
最后大学长说一个比较好的解决方案是用状态模式去实现,可是大学长只是说了状态模式做这个事情多么合适,没给具体解决方案,也没讲具体实现给我们,最后的最后,大家还都是一脸懵逼。
我记得大二的时候还有小伙伴专门去看状态模式,想怎么用状态模式去实现计算器,最后还是很懵逼。。。
昨天看了下设计模式,看了一天最后有点走神了,想起这个事情来了,就花了2个多小时写了这个代码。
没有把计算器的功能完全实现,只是实现了+运算符按键,-运算符按键和数字按键,没有写界面也,最后是在main()函数中模拟按键操作。
二、代码实现
<?php// 状态模式/** * 定义一个计算接口 */abstract class CalculateState { protected $context; public function setContext(Context $context) { $this->context = $context; } public abstract function add(); // 加运算 public abstract function subtract(); // 减运算 public abstract function num($num); // 数字按键操作}/** * 环境类:维护一个ConcreteState子类的实例,这个实例定义当前状态 */class Context { public static $numA = 0; public static $numB = 0; public static $addState = null; public static $subtractState = null; public static $numState = null; public function __construct() { self::$addState = new AddState(); self::$subtractState = new SubtractState(); self::$numState = new NumState(); } private $calculateState; // 定义当前运算状态 public function getCalculateState() { return $this->calculateState; } public function setCalculateState(CalculateState $calculateState) { $this->calculateState = $calculateState; $this->calculateState->setContext($this); // 把当前环境通知到各个实现类中 } public function add() { $this->calculateState->add(); } public function subtract() { $this->calculateState->subtract(); } public function num($num) { $this->calculateState->num($num); }}/** * 点击+运算符,计算器可以做哪些事情 */class AddState extends CalculateState { public function add() { // 点击+运算符要实现的操作 echo "点击 + 运算符按键:" . PHP_EOL; echo Context::$numA . '+' . Context::$numB . PHP_EOL; Context::$numA += Context::$numB; Context::$numB = 0; echo "numA is :" . Context::$numA . PHP_EOL; } public function subtract() { // 点击+运算符之后又点击-运算符 $this->context->setCalculateState(Context::$subtractState); $this->context->getCalculateState()->subtract(); } public function num($num) { // 点击+运算符后又点击数字 $this->context->setCalculateState(Context::$numState); $this->context->getCalculateState()->num($num); }}class SubtractState extends CalculateState { public function add() { $this->context->setCalculateState(Context::$addState); $this->context->getCalculateState()->add(); } public function subtract() { echo "点击 - 运算符按键:" . PHP_EOL; echo Context::$numA . '-' . Context::$numB . PHP_EOL; Context::$numA -= Context::$numB; Context::$numB = 0; echo "numA is : " . Context::$numA . PHP_EOL; } public function num($num) { $this->context->setCalculateState(Context::$numState); $this->context->getCalculateState()->num($num); }}/** * 0~9这十个数字按键 */class NumState extends CalculateState { public function add() { $this->context->setCalculateState(Context::$addState); $this->context->getCalculateState()->add(); } public function subtract() { $this->context->setCalculateState(Context::$subtractState); $this->context->getCalculateState()->subtract(); } public function num($num) { echo "点击数字按键" . $num . PHP_EOL; Context::$numB = Context::$numB * 10 + $num; echo "numB is " . Context::$numB . PHP_EOL; }}/** * 模拟计算器的按钮点击操作 */class Client { public static function main() { $context = new Context(); $context->setCalculateState(new AddState()); $context->add(); $context->num(2); $context->num(2); $context->add(); $context->num(9); $context->subtract(); $context->num(8); $context->add(); }} Client::main();?>
三、代码运行效果
阅读全文
0 0
- 使用状态模式实现计算器
- 使用命令模式实现简单的支持撤销的计算器
- 有限状态机(使用状态模式C++实现)
- 有限状态机(使用状态模式C++实现)
- 使用状态模式实现加班状态变化C++
- 使用JSF实现计算器
- 工厂方法模式 实现计算器
- 【设计模式】使用unity实现状态模式(State mode)
- 简单工厂模式 ,策略模式 实现计算器
- 状态模式简单实现
- LUA实现状态模式
- C++实现状态模式
- 状态模式 C++实现
- 状态模式lua实现
- 状态模式----C++实现
- 状态模式 C++实现
- 状态模式-c++实现
- 状态模式(java实现)
- java实现kubernates API的访问调用
- 典型约瑟夫环问题的实现
- JSP和Servlet(测试计数器)
- Linux采用iptables端口转发的配置
- Coin Test
- 使用状态模式实现计算器
- mongo 安装
- SQL截非标准字符串:CHARINDEX函数调用方法
- 错误:找不到或无法加载主类
- 【R笔记】R机器学习(十四)——BP神经网络
- 光照模型
- mysql 取差集和取交集
- CF758E:Broken Tree(DFS & 思维)
- linux work 2 -vi