week3 命题作业

发布于: 22 小时前

手写单例

单例模式的特点是三私一公

私有属性:保存单例对象,因为需要静态方法调用,所以必须声明为静态属性

私有构造:不允许外部实例化

私有克隆:不允许外部克隆

公共获取单例:因为不能实例化,所以必须是静态方法

设计模式-组合模式代码

接口

interface Component
{
public function __construct($name);
public function add(Component $c);
public function run($dipth);
}

叶子实现

class Leaf implements Component
{
private $name;
public function __construct($name)
{
$this->name = $name;
}
public function add(Component $c)
{
echo "叶子不能添加子节点";
}
public function run($dipth)
{
echo str_repeat('-', $dipth) . $this->name . PHP_EOL;
}
}

组件实现

class Composite implements Component
{
private $name;
private $list = [];
public function __construct($name)
{
$this->name = $name;
}
public function add(Component $c)
{
$this->list[] = $c;
}
public function run($dipth)
{
echo str_repeat('-', $dipth) . $this->name . PHP_EOL;
foreach ($this->list as $component) {
$component->run($dipth + 2);
}
}
}

客户端代码

class Client
{
public function run()
{
$root = new Composite('window form');
$root->add(new Leaf('picture'));
$root->add(new Leaf('button'));
$root->add(new Leaf('button'));
$frame = new Composite('frame');
$frame->add(new Leaf('label'));
$frame->add(new Leaf('checkbox'));
$frame->add(new Leaf('textbox'));
$frame->add(new Leaf('label'));
$frame->add(new Leaf('label'));
$frame->add(new Leaf('linklabel'));
$frame->add(new Leaf('passwordbox'));
$root->add($frame);
$root->run(1);
}
}
(new Client())->run();

执行结果

-window form
---picture
---button
---button
---frame
-----label
-----checkbox
-----textbox
-----label
-----label
-----linklabel
-----passwordbox

组合模式:

叶子节点实现功能方法(run方法)

组合子节点实现功能方法(run方法)和组合方法(add方法)

并且在组合子节点的run方法里需要执行本对象中的叶子节点方法

发布于: 22 小时前 阅读数: 6
用户头像

耕夫

关注

还未添加个人签名 2019.02.11 加入

还未添加个人简介

评论

发布
暂无评论
week3 命题作业