欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

关于装饰模式引发的思考

程序员文章站 2022-05-10 13:49:36
...
本人是一个模式学习的新手,学习到装饰模式的时候,我想到了一个问题,我是否可以利用一个属性值$message来对内容进行一些存储,就编下了下面的代码,始终没办法找到原因,我想得到的结果是:html过滤敏感词汇过滤测试一下 但是结果却是html过滤测试一下,于是我就思考是否是没有将$msg存到$message中,但是但是为什么结果又是html过滤测试一下,中断测试也没能找到答案,所以再这里想得到各位的帮助,一起讨论讨论这段代码,
 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('测试一下');

回复内容:

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

 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('测试一下');

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

return 'html过滤'.$this->message;

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

html过滤测试一下

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

$obj = new htmlFilter(new ensitiveFilter(new setmessage()));

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