接着问题来了,在上一节中我们只是存储了字符串到mylog.txt.那么我们现在想以html或者xml的形式分别存储在mylog.html和mylog.xml中要怎么办呢。
首先在temp中建立mylog.html和mylog.xml
首先我们要先规定一个接口,规定一个方法format(),用于生成string、xml、html形式的log信息。
interface iFormatter {
public function format();
}
有了这个接口我们就可以生成具体的实现类,每一个实现类都要实现format()方法。
每一种策略的具体表现形式……
class Formatter_String implements iFormatter {
public function format($message) {
return $message.PHP_EOL;
}
}
class Formatter_XML implements iFormatter {
public function format($message) {
$timestamp = time();
// heredoc string syntax
$xml = <<<XML_EOL
<message>
<time>$timestamp</time>
<text>$message</text>
</message>
XML_EOL;
return $xml.PHP_EOL;
}
}
class Formatter_HTML implements iFormatter {
public function format($message) {
$timestamp = time();
// heredoc string syntax
$html = <<<HTML_EOL
<p>
<b>Timestamp:</b> $timestamp
<br />
<b>Message:</b> $message
</p>
HTML_EOL;
return $html.PHP_EOL;
}
}
现在可以写一个测试类,去测试每一种格式化信息的输出。不过这样测试类与具体的实现有了一种耦合的关系。这不是编程所希望的--高内聚,低耦合。
让我们来定义一个上下文的类,让它与客户端代码进行交互。也是上节中我们的logger类
代码如下表示(这里也是策略模式实现的地方,要仔细看哦。):
class Logger{
protected $formatter;
private $file = null;
protected function __constructfo($formatter, $file) {
if($formatter instanceof iFormatter)//这里也显示了我们要定义一个接口的必要性。
{
$this->formatter = $formatter;
$this->file = $file;
}
else
{
trigger_error('Invalid Formatter!', E_USER_ERROR);
}
}
public function write($message) {
$formatted_message = $this->formatter->format($message);
file_put_contents($this->file, $formatted_message, FILE_APPEND);
}
}
要仔细阅读以上代码。其实并不难有不懂的可以留言。
下面我们就可以来测试一下:
$logger = new Logger_File(new Formatter_XML(), './tmp/mylog.xml');
$logger->write('I am an XML formatted log message!');
OK,到这里我们通过策略模式去实现了格式化不同的形式存储在了本地,下一节我们要继续用策略模式去把所有格式化的信息既可以存储在本地有可以存储在数据库里。。
未完待续……(有不明白的地方请留言……)
分享到:
相关推荐
在"Java Patterns - Strategy.rar_strategy"这个压缩包中,可能包含了关于策略模式的详细讲解和实例代码。"www.pudn.com.txt"可能是提供了一些相关的资料链接或者文章,它可能包含了策略模式在实际项目中的应用示例...
这个压缩包"DesignPatterns"可能包含了关于策略模式的详细示例代码,包括如何创建策略接口、具体策略类以及如何在上下文类中使用这些策略。通过阅读和分析这些代码,你可以更深入地理解策略模式的工作原理和应用场景...
- 策略模式(Strategy):定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法的变化独立于使用它的客户。 - 模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到...
行为型模式主要涉及对象间职责的分配,如观察者(Observer)、策略(Strategy)和访问者(Visitor)等。 "pattern-java.pdf"这本书可能详细介绍了这些模式的实现和应用。在Java中,设计模式通常结合面向对象特性,...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的对象和一个行为根据...
- 策略模式(Strategy):定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。本模式使得算法可以独立于使用它的客户而变化。 - 模板方法模式(Template Method):在一个方法中定义一个算法的骨架,...
文件列表中的"Patterns"可能包含了一些关于策略模式和其他设计模式的示例代码或者讨论。这些文件可以帮助我们更好地理解如何在实际项目中应用策略模式,以及如何与其他设计模式结合使用。 总结来说,策略模式是一种...
17. **策略模式(Strategy)**:定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换,策略对象改变对象的行为方式。 18. **模板方法模式(Template Method)**:在一个方法中定义一个算法的骨架,而将一些...
命令模式(Command),解释器模式(Interpreter),迭代器模式(Iterator),中介者模式(Mediator),备忘录模式(Memento),观察者模式(Observer),状态模式(State),策略模式(Strategy),模板方法模式...
行为型模式(Behavioral Patterns):这类模式定义了对象之间的交互和责任分配,如责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式...
- **策略**(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。 - **模板方法**(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 - **访问者**(Visitor):...
- 策略模式(Strategy):定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换,让算法的变化独立于使用算法的客户。 - 模板方法模式(Template Method):在一个方法中定义一个算法的骨架,而将一些...
策略模式(Strategy)让算法可以在运行时选择不同的实现;观察者模式(Observer)定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新;职责链模式(Chain of ...
3. **行为型模式**:行为型模式着重于对象之间的责任分配和通信,包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式...
3. **行为型模式**:这些模式主要涉及对象间交互和职责分配,如策略模式(Strategy)、命令模式(Command)、观察者模式(Observer)、迭代器模式(Iterator)和责任链模式(Chain of Responsibility)。策略模式使...
3. 行为型模式:关注对象之间的责任分配和交互,如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录...
3. **行为型模式**:这类模式涉及对象之间的责任分配和通信,包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式...
### 四、策略模式(Strategy Pattern) 策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互换。策略模式让算法独立于使用它的客户而变化。在Java中,可以通过定义一个接口来表示不同的算法,然后创建...
3. **策略模式(Strategy Pattern)**:在AI设计中,策略模式非常常见。它定义了一族算法,并将每个算法封装起来,使得它们可以相互替换。比如,游戏中的敌人可以有不同的攻击策略,如近战、远程或躲避。 4. **观察...
1. **策略模式**(Strategy):定义一系列算法,并将每个算法封装起来,使它们可以互相替换。 2. **模板方法模式**(Template Method):在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。 3. **观察者...