#Design pattern

当一个对象的内在状态改变时允许改变其行为, 这个对象看起来像是改变了其类.
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况. 把状态的判断逻辑转移到表示不同状态的一系列类当中, 可以把复杂的判断逻辑简化
如果这个状态判断很简单,那就没必要用状态模式了
状态模式使用一个对象可以在不同的状态下表现出不同的行为。

  • 状态的使用:
  • 比如表示一个人在一天不同时刻的工作内容.

跟策略模式的对比

  • 状态模式可以帮助对象来管理它的状态
  • 策略模式使得客户端可以选择不同的行为。
  • 一个不太容易看到的区别是,谁去驱动行为的改变。
  • 在策略模式中,是客户端驱动的,它给上下文信息提供了不同的策略
  • 在状态模式中,状态的迁移是由Context或者State对象自己来管理的
  • 从理论上说,策略模式和状态模式还有一个不同,前者定义的是一个对象“如何”去做一件事情,比如说如何对数据进行排序,而另一方面,状态模式定义的是“什么”以及“何时“,比如说一个对象能做什么,某个时间点它处于哪个状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

<?php

abstract class Request {

abstract function handel();

}

class LogRequest extends Request {

function handel() {
echo "LogRequest\n";
}
}

abstract class RequestDecorator extends Request {

protected $request;

public function __construct(Request $request) {
$this->request = $request;
}
}


class AuthRequestDecorator extends RequestDecorator {

function handel() {
echo "AuthRequestDecorator\n";
$this->request->handel();
}

}


class FormRequestDecorator extends RequestDecorator {

function handel() {
echo "FormRequestDecorator\n";
$this->request->handel();
}

}


$AuthRequestDecorator = new FormRequestDecorator(new AuthRequestDecorator(new LogRequest()));
$AuthRequestDecorator->handel();

它定义了算法家族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化, 不会影响到使用算法的客户。不同的策略都是完成相同的工作,只是实现不同, 它可以以相同的方式调用所有的算法, 减少了各种算法类与使用算法类之间的耦合。

UML结构图

image

  • Strategy 提供算法的抽象接口,图中它提供了一个AlgorithmInterface接口方法,让具体的策略类来实现该方法。Strategy类可以是接口也可以是抽象类。在策略类是抽象类的情况下,通常AlgorithmInterface方法也是抽象方法。

    阅读更多

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×