Home >Backend Development >PHP Tutorial >关于装饰模式引发的思考

关于装饰模式引发的思考

WBOY
WBOYOriginal
2016-06-06 20:48:011015browse

本人是一个模式学习的新手,学习到装饰模式的时候,我想到了一个问题,我是否可以利用一个属性值$message来对内容进行一些存储,就编下了下面的代码,始终没办法找到原因,我想得到的结果是:html过滤敏感词汇过滤测试一下 但是结果却是html过滤测试一下,于是我就思考是否是没有将$msg存到$message中,但是但是为什么结果又是html过滤测试一下,中断测试也没能找到答案,所以再这里想得到各位的帮助,一起讨论讨论这段代码,

<code><?php abstract class messageDetail
    {
        abstract function filter($msg);
    }

    class setmessage extends messageDetail
    {
        public function filter($msg)
        {
            return $msg;
        }
    }

    class messageHandle extends messageDetail
    {
        public $message;
        public $obj;
        public function __construct($obj)
        {
            $this -> obj = $obj;
        }

        public function filter($msg)
        {
            $this -> message = $msg;
        }
    }

    class htmlFilter extends messageHandle 
    {
        public function filter($msg)
        {
            parent::filter($msg);
            return 'html过滤'.$this->message;
        }
    }

    class ensitiveFilter extends messageHandle
    {
        public function filter($msg)
        {
            parent::filter($msg);
            return '敏感词汇过滤'.$this->message;
        }
    }

    $obj = new htmlFilter(new ensitiveFilter(new setmessage()));
    echo $obj -> filter('测试一下');
</code>

回复内容:

本人是一个模式学习的新手,学习到装饰模式的时候,我想到了一个问题,我是否可以利用一个属性值$message来对内容进行一些存储,就编下了下面的代码,始终没办法找到原因,我想得到的结果是:html过滤敏感词汇过滤测试一下 但是结果却是html过滤测试一下,于是我就思考是否是没有将$msg存到$message中,但是但是为什么结果又是html过滤测试一下,中断测试也没能找到答案,所以再这里想得到各位的帮助,一起讨论讨论这段代码,

<code><?php abstract class messageDetail
    {
        abstract function filter($msg);
    }

    class setmessage extends messageDetail
    {
        public function filter($msg)
        {
            return $msg;
        }
    }

    class messageHandle extends messageDetail
    {
        public $message;
        public $obj;
        public function __construct($obj)
        {
            $this -> obj = $obj;
        }

        public function filter($msg)
        {
            $this -> message = $msg;
        }
    }

    class htmlFilter extends messageHandle 
    {
        public function filter($msg)
        {
            parent::filter($msg);
            return 'html过滤'.$this->message;
        }
    }

    class ensitiveFilter extends messageHandle
    {
        public function filter($msg)
        {
            parent::filter($msg);
            return '敏感词汇过滤'.$this->message;
        }
    }

    $obj = new htmlFilter(new ensitiveFilter(new setmessage()));
    echo $obj -> filter('测试一下');
</code>

纠正一个错误吧,htmlFilter类中的filter方法里返回的应该是:

<code class="lang-php">return 'html过滤'.$this->message;
</code>

你这段代码的运行结果是:

html过滤测试一下

这里很明显,实际结果和代码的预期结果一致。为什么?我们看这一行:

<code class="lang-php">$obj = new htmlFilter(new ensitiveFilter(new setmessage()));
</code>

这一行初始化了一个htmlFilter对象。同时把一个ensitiveFilter对象传入,但是由于htmlFilter类没有对传入对象处理,于是乎这个ensitiveFilter对象实际上就被抛弃了,自然我们也可以不管后面的setmessage了。于是乎自然而然,它只会输出“html过滤”了。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn