zoukankan      html  css  js  c++  java
  • 装饰器模式

    原文链接:http://www.orlion.ga/735/

    解释:

        如果已有对象的部分内容或功能性发生了改变,但是不需要修改原始对象的结构,那么使用装饰器设计模式最合适

    需求:

        我们本来有一个UserList类:

    namespace Decorator;
    
    class UserList{
    
    	public $users = [];
    
    	public function addUser($user) {
    		$this->users[] = $user;
    	}
    
    	public function outUsers(){
    		foreach ($this->users as $user) {
    			echo $user . '<br/>';
    		}
    	}
    }

        App.php:

    require 'UserList.php';
    $ul = new DecoratorUserList();
    $ul->addUser('a');
    $ul->addUser('b');
    $ul->addUser('c');
    
    $ul->outUsers();

        其中outUsers是把UserList保存的所有的用户打印出来,后来我们的需求变了,在输出用户的时候还要将用户变成大写的,直观的写法是修改outUsers()方法。但是对于这么小的改变最好的做法不是修改基类,而是创建一个基于装饰器模式的对象。

    代码:

        创建一个装饰器:

    namespace Decorator;
    
    class UserListDecorator{
    
    	private $_ul;
    
    	public function __construct(UserList $ul) {
    		$this->_ul = $ul;
    	}
    
    	public function makeCaps() {
    		foreach ($this->_ul->users as & $user) {
    			$user = strtoupper($user);
    		}
    	}
    }

        可以看到我们在装饰器类的makeCaps对userlist对象做了修改,将它保存的所有用户都变成了大写。

    App.php:

    require 'UserList.php';
    require 'UserListDecorator.php';
    
    $ul = new DecoratorUserList();
    $ul->addUser('a');
    $ul->addUser('b');
    $ul->addUser('c');
    
    $ul->outUsers();
    
    $ulDecorator = new DecoratorUserListDecorator($ul);
    $ulDecorator->makeCaps();
    
    $ul->outUsers();
  • 相关阅读:
    python中Cmap的用法
    Js中 关于top、clientTop、scrollTop、offsetTop
    通过ByteArray来播放MP3
    JS中的call()和apply()方法
    flash 屏幕更新 Essential.ActionScript
    Aptana Studio 3 如何汉化,实现简体中文版
    Flash Builder更新Flash player版本
    随机不重复
    Aptana :调试 javascript 图解
    获取两个数组的相同元素或不相同的元素
  • 原文地址:https://www.cnblogs.com/orlion/p/5350913.html
Copyright © 2011-2022 走看看