设计模式之策略模式
原创
©著作权归作者所有:来自51CTO博客作者jackjie2010的原创作品,请联系作者获取转载授权,否则将追究法律责任
首先,来看定义,Strategy模式即策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
解释什么是算法族?算法族就是描述事物的一组具体行为类,本质上具有相似性,比如,都实现同一个接口,但具体实现方法不同。
优点:
1、 提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
3、 遵守大部分GRASP原则和常用设计原则(多用组合,少用继承),高内聚、低偶合。
缺点:
1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
好了,其它不说了,上代码。以下是仿照Head First里面的策略模式写的php版
<?php
/*抽象duck类*/
abstract class Duck {
var $flyBehavior;
var $quackBehaivor;
function Duck() {
}
public function performFly() {
$this->flyBehavior->fly();
}
public function performQuack() {
$this->quackBehaivor->quack();
}
abstract function display();
public function swim() {
echo "all ducks can swim.<br>";
}
function setFlyBehavior(FlyBehavior $f) {
$this->flyBehavior = $f;
}
function setQuackBehaivor(QuackBehavior $q) {
$this->quackBehaivor = $q;
}
}
//飞的行为类
interface FlyBehavior {
public function fly();
}
//叫的行为类
interface QuackBehavior {
public function quack();
}
class FlyWithSwings implements FlyBehavior{
function fly() {
echo "I can flying<br>";
}
}
class FlyWithNoSwings implements FlyBehavior{
function fly() {
echo "I can't flying<br>";
}
}
/*把飞这种行为单独拿出来,可以给其它类使用;比如说,我创建一个火箭飞行类*/
class RoketFly implements FlyBehavior{
function fly() {
echo 'I\'m flying with a rocket.';
}
}
/*******************************************************具体quack类*/
class Quackq implements QuackBehavior {
function quack() {
echo "quack1<br>"; //嘎嘎的叫
}
}
class MuteQuack implements QuackBehavior {
function quack() {
echo "slience<br>"; //不叫
}
}
class Squeack implements QuackBehavior {
function quack() {
echo "Squeack<br>"; //吱吱的叫
}
}
/*具体的鸭子类----绿头鸭*/
class MalarDuck extends Duck{
function MalarDuck() {
$this->flyBehavior = new FlyWithSwings();
$this->quackBehaivor = new Quackq();
}
function display() {
echo 'I\'m a malar duck.';
}
}
$a = new MalarDuck();
$a->performFly();
$a->performQuack();
$a->display();
?>
下一篇:本博客文章免责声明
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
设计模式-策略模式
设计模式之策略模式
策略模式 设计模式