设计模式学习笔记(6) - 状态模式

简介:

状态模式与策略模式很像,真的很像。

下面举个例子来说明,我们都知道银行经常将用户划分个三六九等,划分的方法很简单,就是用户的存款。下面用php代码来模拟下这个过程:

 
 
  1. <?php 
  2. /** 
  3.  *  状态模式的例子 
  4.  * 
  5.  *  Copyright(c) 2012 by ustb80. All rights reserved 
  6.  * 
  7.  *  To contact the author write to {@link mailto:ustb80@163.com} 
  8.  * 
  9.  * @author ustb80 
  10.  * @version $Id: State.php,v 1.0 2012-11-01 
  11.  * @package 
  12.  */ 
  13.  
  14. // ------------------------------------------------------------------------ 
  15.  
  16. $config = array('new'=>10, 'silver'=>10000, 'gold'=>999999999999); 
  17.  
  18. /** 
  19.  * 状态抽象类 
  20.  * 
  21.  * @author ustb80 
  22.  */ 
  23. abstract class State 
  24.     protected $client
  25.     protected $silver_limit = 10; 
  26.     protected $gold_limit = 10000; 
  27.  
  28.     abstract function deposit($amount);// 存款 
  29.     abstract function withdraw($amount);// 取款 
  30.  
  31.     protected function changeState() 
  32.     { 
  33.         global $config
  34.         if (!empty($config)) 
  35.         { 
  36.             foreach ($config as $key => $val
  37.             { 
  38.                 if ($this->client->balance < $val
  39.                 { 
  40.                     $state_name = ucfirst($key)."State"
  41.                     echo "亲,你已经成为{$key}卡用户\n"
  42.                     $this->client->setState($this->client->$state_name); 
  43.                     break
  44.                 } 
  45.             } 
  46.         } 
  47.     } 
  48.  
  49. // 实现各种乱七八糟的状态 
  50.  
  51. // 新用户 
  52. class NewState extends State 
  53.     public function __construct($client
  54.     { 
  55.         $this->client = $client
  56.     } 
  57.  
  58.     public function deposit($amount
  59.     { 
  60.         $this->client->balance += $amount
  61.         $this->changeState(); 
  62.     } 
  63.  
  64.     public function withdraw($amount
  65.     { 
  66.         die("亲,你还没存钱呢就想着取钱呀,门儿都没有!\n"); 
  67.     } 
  68.  
  69. // 银卡用户 
  70. class SilverState extends State 
  71.     public function __construct($client
  72.     { 
  73.         $this->client = $client
  74.     } 
  75.  
  76.     public function deposit($amount
  77.     { 
  78.         $this->client->balance += $amount
  79.         $this->changeState(); 
  80.     } 
  81.  
  82.     public function withdraw($amount
  83.     { 
  84.         if ($this->balance < $amount
  85.         { 
  86.             die("亲,余额不足\n"); 
  87.         } 
  88.  
  89.         $this->client->balance -= $amount
  90.         $this->changeState(); 
  91.     } 
  92.  
  93. // 金卡用户 
  94. class GoldState extends State 
  95.     public function __construct($client
  96.     { 
  97.         $this->client = $client
  98.     } 
  99.  
  100.     public function deposit($amount
  101.     { 
  102.         $this->balance += $amount
  103.     } 
  104.  
  105.     public function withdraw($amount
  106.     { 
  107.         if ($this->client->balance < $amount
  108.         { 
  109.             die("亲,余额不足\n"); 
  110.         } 
  111.  
  112.         $this->client->balance -= $amount
  113.         $this->changeState(); 
  114.     } 
  115.  
  116.  
  117. // ------------------------------------------------------------- 
  118.  
  119. /** 
  120.  * 银行客户类 
  121.  * 
  122.  * @author ustb80 
  123.  */ 
  124. class BankClient 
  125.     public $balance
  126.     private $state
  127.     public function __construct() 
  128.     { 
  129.         global $config
  130.         foreach ($config as $key => $val
  131.         { 
  132.             $method_name = ucfirst($key)."State"
  133.             $this->$method_name = new $method_name($this); 
  134.         } 
  135.  
  136.         // 初始化状态 
  137.         $this->state = $this->NewState; 
  138.     } 
  139.     /** 
  140.      * 存钱 
  141.      * 
  142.      * @param float $amount 存入金额 
  143.      */ 
  144.     public function deposit($amount
  145.     { 
  146.         $this->state->deposit($amount); 
  147.     } 
  148.  
  149.     /** 
  150.      * 取钱 
  151.      * 
  152.      * @param float $amount 取出金额 
  153.      */ 
  154.     public function withdraw($amount
  155.     { 
  156.         $this->state->withdraw($amount); 
  157.     } 
  158.  
  159.     /** 
  160.      * 变更状态 
  161.      * 
  162.      * @param object $state 
  163.      */ 
  164.     public function setState($state
  165.     { 
  166.         $this->state = $state
  167.     } 
  168.  
  169.     /** 
  170.      * 查看余额 
  171.      */ 
  172.     public function getBalance() 
  173.     { 
  174.         return $this->balance; 
  175.     } 
  176.  
  177. // 测试代码 
  178. $BankClient = new BankClient(); 
  179. $BankClient->deposit(10000); 
  180. $BankClient->withdraw(5000); 
  181. $BankClient->deposit(100000); 
  182.  
  183. // 查看余额 
  184. echo $BankClient->getBalance(); 

上面用了一个配置数组来动态创建对象实例。

输出结果:

 
 
  1. 亲,你已经成为gold卡用户 
  2. 亲,你已经成为silver卡用户 
  3. 亲,你已经成为gold卡用户 
  4. 105000 









本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1047086,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
设计模式
设计模式之 State(状态模式)
设计模式之 State(状态模式)
43 0
|
2月前
|
设计模式 Java Kotlin
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
29 2
|
2月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
44 0
|
2月前
|
设计模式 Java Kotlin
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
27 0
|
3月前
|
设计模式 Java 测试技术
Java设计模式-状态模式(18)
Java设计模式-状态模式(18)
|
4月前
|
设计模式 网络协议 Java
【十五】设计模式~~~行为型模式~~~状态模式(Java)
文章详细介绍了状态模式(State Pattern),这是一种对象行为型模式,用于处理对象在其内部状态改变时的行为变化。文中通过案例分析,如银行账户状态管理和屏幕放大镜工具,展示了状态模式的应用场景和设计方法。文章阐述了状态模式的动机、定义、结构、优点、缺点以及适用情况,并提供了Java代码实现和测试结果。状态模式通过将对象的状态和行为封装在独立的状态类中,提高了系统的可扩展性和可维护性。
【十五】设计模式~~~行为型模式~~~状态模式(Java)
|
5月前
|
设计模式 JavaScript Go
js设计模式【详解】—— 状态模式
js设计模式【详解】—— 状态模式
83 7
|
5月前
|
设计模式 Java
Head First设计模式学习笔记
Head First设计模式学习笔记
|
6月前
|
设计模式
状态模式-大话设计模式
状态模式-大话设计模式
|
6月前
|
设计模式 存储
行为设计模式之状态模式
行为设计模式之状态模式