原型模式
原型模式(对象克隆以避免创建对象时的消耗) ,又称克隆模式。
1:与工厂模式类似,都是用来创建对象。
2:与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作。
3:原型模式适用于大对象的创建,创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需要内存拷贝即可。
<?php // 人 class Person { private $name; private $age; public function __construct($name, $age) { $this->name = $name; $this->age = $age; } public function showMyself() { echo "我是{$this->name}, 年龄{$this->age}" . PHP_EOL; } public function coding() { echo "我是一个码农, 我在用双手改变世界以及我的发际线..." . PHP_EOL; } public function reading() { echo "阅读是我快乐, 我爱阅读胜过爱左手..." . PHP_EOL; } public function fallInLove() { echo "神鬼狐仙, 风月无边..."; } public function copy() { return clone($this); } } // 代码测试 $tony = new Person("Tony", 26); $tony->showMyself(); $tony->coding(); $tony1 = $tony->copy(); $tony1->showMyself(); $tony1->reading(); $tony2 = $tony->copy(); $tony2->showMyself(); $tony2->fallInLove();
结果:
我是Tony, 年龄26 我是一个码农, 我在用双手改变世界以及我的发际线... 我是Tony, 年龄26 阅读是我快乐, 我爱阅读胜过爱左手... 我是Tony, 年龄26 神鬼狐仙, 风月无边...
装饰器模式
1:装饰器模式,可以动态的添加修改类的功能
2:一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重写实现类的方法
3:使用装饰器模式,仅需要在运行时添加一个装饰器对象即可实现,可以实现最大额灵活性。
最常见的就是一些游戏开发商,通过去做一些装备,例如武器,衣服,鞋子,戒指等等,来吸引玩家购买,穿在身上不仅好看,还带有额外属性。
这个例子是典型装饰器模式的应用,特点是在不影响其他类的情况下动态添加其它具体装备类。
<?php /** 构件接口类 * interface IComponent */ interface IComponent{ function Display(); } /** 人物类 * Person */ Class Person implements IComponent{ private $name; function __construct($name){ $this->name = $name; } function Display(){ echo "{$this->name}当前装备:"; } } /** 装备类 * Equipment */ Class Equipment implements IComponent{ protected $component; function Decorator(IComponent $component) { // 动态添加 $this->component = $component; } function Display(){ if(!empty($this->component)){ $this->component->Display(); } } } /** 具体装备 武器类 * Weapon */ Class Weapon extends Equipment{ function Display(){ parent::Display(); echo "龙泉剑 "; } } /** 具体装备 戒指类 * Ring */ Class Ring extends Equipment{ function Display(){ parent::Display(); echo "复活戒指 "; } } /** 具体装备 鞋子类 * Shoes */ Class Shoes extends Equipment{ function Display(){ parent::Display(); echo "御风履 "; } } // 如果需要可以继续添加具体的装备 腰带 裤子 手镯
<?php // 装饰器模式 index.php header("Content-Type:text/html;charset=utf-8"); require_once "Decorator.php"; // 创建人物 $people = new Person("战士"); // 武器 $Weapon = new Weapon(); // 戒指 $Ring = new Ring(); // 鞋子 $Shoes = new Shoes(); // 动态添加函数 $Weapon->Decorator($people); $Ring->Decorator($Weapon); $Shoes->Decorator($Ring); // 显示 $Shoes->Display();
输出结果:
战士当前装备:龙泉剑 复活戒指 御风履
装饰器模式的优点:
1、使用装饰器模式来实现扩展比继承更加灵活,它可以在不需要创造更多子类的情况下,将对象的功能加以扩展。
2、可以用不同的装饰器进行多重装饰,装饰的顺序不同,可能产生不同的效果。
3、装饰类和被装饰类可以独立发展,不会相互耦合;装饰器模式相当于是继承的一个替代模式。
装饰器模式和中间件思想还是有些颇有相似之处。 AOP 面向切面编程就是装饰器模式的一种实现。