LaneBlog

蝼蚁虽小,也有梦想

PHP Socket服务 | PHP微信开发框架 | 开源博客

面向对象的洗礼:设计模式(二)之策略模式

Clicks: 1744 Date: 2014-04-16 09:03:08 Power By 李轩Lane

    策略模式,策略就是算法和变化,策略模式就是对算法和变化的封装。是条件选择从客户端到服务端的转移。客户端与算法类的彻底隔离。
<?php
abstract class Strategy{
    public $paramA = '';
    public $paramB = '';
    public function getResult(){

    }
}
class AlgorithmA extends Strategy{
    public function algorithmA(){
        //算法A的实现
    }
}
class AlgorithmB extends Strategy{
    public function algorithmB(){
        //算法B的实现
    }
}
class AlgorithmC extends Strategy{
    public function algorithmC(){
        //算法C的实现
    }
}
?>
场景: 沃尔玛要做一个收银软件。有打8折,打5折等,有每满100减20等。
<?php
//抽象类
abstract class Pay{
    public $cash = '';
    public $total = '';
    public function getResult(){
        return $this->total;
    }
}
//打折
class Discount extends Pay{
    public function algorithm($cash, $discount=0.8){
        $this->total = $cash * $discount;
        return $this->getResult();
    }
}
//满多少减多少
class Reduce extends Pay{
    public function algorithm($cash, $satisfied=100, $returnCash=20){
        $this->total = $cash - floor($cash / $satisfied) * $returnCash;
        return $this->getResult();
    }
}
class Context{
    private $obj;
    public function __construct($type){
        switch($type){
            case 1:
                $this->obj = new Discount();
                break;
            case 2:
                $this->obj = new Reduce();
                break;
        }
    }
    public function algorithm(){
        $this->obj->algorithm();
    }
}
//客户端
$obj = new Context($_GET['type']);
echo $obj->algorithm();
?>
优点:客户端不需要做条件判断,而且仅仅需要认识一个类即可。乍一看和简单工厂很相似呢。
©2014 www.lanecn.com , All rights reserved. Power By Li Xuan.  京ICP备14005030号