PHP设计模式 五 (代理模式 装饰器模式)

代理模式

在客户端和实体之间建立一个代理对象,客户端对实体的操作全部委派给代理对象,隐藏实体具体实现细节。

Proxy还可以与业务代码分离,部署到另外的服务器,业务代码中通过RPC来委派任务。

代理Proxy.php:

<?php

namespace Components\Proxy;

class Proxy implements IUserProxy {

	function get($id) {
		$db = \Components\Register::get('slave');
		$db->query('select name from users where id ='.$id);
	}

	function set($id, $name) {
		$db = \Components\Register::get('master');
		$db->query("update users set name=$name where id =$id");
	}
}

IUserProxy.php:

<?php

namespace Components\Proxy;

interface IUserProxy {

	function get();

	function set();
}

调用:

/* 代理模式  适用于类似主从 */
$proxy = new Proxy();
$proxy->get('1');
$proxy->set('1', 'php');

装饰器模式

在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

装饰器接口IDecorator.php:

<?php

namespace Components\Decorator;

/**
 * 装饰器模式  接口
 * @author WH
 *
 */
interface IDecorator {

	function before();

	function after();

}

装饰器1 DecoratorAttr1.php:

<?php

namespace Components\Decorator;

class DecoratorAttr1 implements IDecorator{

	function before() {
		echo '<br><div style="color:red">';
	}

	function after() {
		echo '</div>';
	}

}

装饰器2  DecoratorAttr2.php:

<?php

namespace Components\Decorator;

class DecoratorAttr2 implements IDecorator{

	function before() {
		echo '<br><div style="font-size:30px">';
	}

	function after() {
		echo '</div>';
	}

}

使用:

/* 装饰器模式 原类 */
class DecoratorClassTest {
	protected $decorators = array();

	//添加装饰器
	function addDecorator(\Components\Decorator\IDecorator $decorator) {
		$this->decorators[] = $decorator;//添加装饰器
	}

	function before(){
		foreach ($this->decorators as $decorator) {
			$decorator->before();//调用装饰器
		}
	}

	function after(){
		//这里可用栈
		$decorators = array_reverse($this->decorators);
		foreach ($decorators as $decorator) {
			$decorator->after();//结束装饰器
		}
	}

	function test() {
		$this->before();
		echo 'running<be>';
		$this->after();

	}
}
$decoratorTest = new DecoratorClassTest();
$decoratorTest->addDecorator(new \Components\Decorator\DecoratorAttr1());
$decoratorTest->addDecorator(new \Components\Decorator\DecoratorAttr2());
$decoratorTest->test();
时间: 2024-10-20 12:22:54

PHP设计模式 五 (代理模式 装饰器模式)的相关文章

Java设计模式(四) 装饰器模式 代理器模式

(七)装饰器模式 Decorator 装饰器模式是为了动态的给一个对象增加一些新功能.装饰对象与被装饰的对象需要实现同一个接口,装饰对象持有被装饰对象的实例. interface DecoratorSourceable{ public void method(); } //被装饰类 class DecoratorSource implements DecoratorSourceable{ public void method(){ System.out.println("Source"

设计模式(八)装饰器模式Decorator(结构型)

设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许

设计模式之简单理解装饰器模式与运用

1.什么是装饰器模式 ? 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. ? 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 2.装饰器模式的重要组成部分 ①装饰器模式特点: (1) 装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. (2) 装饰对象包含一个真实对象的引用(reference

设计模式(三)——装饰器模式(Decorator Pattern)

发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装潢吧,比如刚买的毛坯房,只有一个没有门,直接就可以进去. 首先设计一个房子类Room,实现一个进入方法Access /// <summary> /// 抽象接口 用来进行约束 /// </summary> public interface IAccess { void Access()

【一起学设计模式】状态模式+装饰器模式+简单工厂模式实战:(一)提交个订单我到底经历了什么鬼?

前言 之前在我的博客(一枝花算不算浪漫)中已经更新过两篇设计模式相关的内容 [一起学设计模式]策略模式实战一:基于消息发送的策略模式实战 [一起学习设计模式]策略模式实战二:配合注解 干掉业务代码中冗余的if else... [一起学设计模式]访问者模式实战:权限管理树删节点操作 [一起学设计模式]命令模式+模板方法+工厂方法实战: 如何优雅的更新商品库存... 上面内容都是基于真实业务场景精简后的设计(工作中真实场景使用到的). 之前为了学习设计模式,看过网上很多相关博客讲解,大都是画下UML

【设计模式】9、装饰器模式

1 package com.shejimoshi.structural.Decorator; 2 3 4 /** 5 * 功能:这个是我们装饰器的基类,用来生成被装饰类和装饰器类 6 * 时间:2016年2月25日上午10:05:37 7 * 作者:cutter_point 8 */ 9 public abstract class Component 10 { 11 //这个方法就是我们装饰器要进行装饰的操作 12 public abstract void tuo(); 13 } 1 packa

设计模式(四)装饰器模式

首先,让我们看看枪: 某一把枪,可以给它加上不同的组件,使它具有不同的功能.比如说ak47原来是这样: 给他加了刺刀之后,它有了拼刺刀的作用: 如果给它加上望远镜,于是有了瞄准狙击的功能: 如果还要添加功能,这里我们就可以用装配器模式对这个枪进行修饰.一个普通枪以及其他种类的枪都属于武器,也就是说他们都要继承一个武器类,无论是普通枪还是添加了功能的枪他们都是枪,此外,一个枪不仅可以安装望远镜,还可以同时安装刺刀.于是乎装配器模式的关系可以用下图来形容,建模工具搞了半天没搞到. Gun和Funct

结构型模式-装饰器模式

对原有对象进行修饰,如有一个篮子,现在对篮子进行修饰,放入苹果,香蕉,橙子 package constructional.pattern.decorator; /* * 创建一个对象的抽象也就是接口 */ public interface Basket { public void show(); } package constructional.pattern.decorator; /** *身份:被装饰的对象 *一个对接口的实现,这个对象表示要我们将来要修饰的篮子里装内容,如果想修饰篮子的造型

结构型模式————装饰器模式(3.1)

什么是装饰器模式? [先吃三颗栗子:] 1.PC=主机+显示器+键盘+鼠标+鼠标垫 主机是核心,而其他的组成部分都是装饰. 2.手抓饼=饼+鸡蛋+培根+黄瓜 饼是核心,鸡蛋,培根是可选的,可以理解为装饰. 3.咖啡=咖啡+牛奶+冰+方糖 咖啡是核心,牛奶等可选. 比喻虽然形象生动,但是与实际或多或少会产生偏差. 抽象的解释:装饰器模式的目的--核心部分和装饰部分可以自由组合. 装饰器模式的功能 对于软件开发来说,聚焦于软件的灵活性和可扩展性. 装饰器模式要求: 装饰可选 装饰可扩展 核心部分可扩