代理模式

<?php

/**
* 代理模式:为其他对象提供一个代理以控制这个对象的访问
它是给某一个对象提供一个替代者,使之在client对象和subject对象之间编码更有效率。
代理可以提供延迟实例化,控制访问等 应用场景:如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
控制对原始对象的访问。
*
*/ /**
* 抽象主题角色(Subject):天气
*
*/
interface Weather
{
public function request($city);
public function display($city);
public function isValidCity($city); } /**
* 真实主题角色(RealSubject):
*
*/
class RealWeather implements Weather
{
protected $_url = 'http://www.google.com/ig/api?&oe=utf-8&hl=zh-cn&weather=';
protected $_weatherXml = '' ;
function __construct(){ } public function request($city){
$this->_weatherXml = file_get_contents($this->_url . $city );
}
public function display($city ){
// if ($this->_weatherXml == '') {
// $this->request($city);
// }
echo '天气预报';
} public function isValidCity($city){ } } /**
* 代理角色(Proxy):延迟代理
*
*/
class ProxyWeather implements Weather {
private $_client ; private function client() {
if (! $this->_client instanceof RealWeather) {
$this->_client = new RealWeather();
}
return $this->_client;
} public function request($city){
$this->_client->request($city);
} public function isValidCity($city) {
return $this->_client->isValidCity($city);
} public function display($city) {
return $this->client()->display($city);
}
}
/**
* 代理角色(Proxy):动态代理
*
*/
class DynamicProxyWeather {
protected $_subject; public function __construct($subject) {
$this->_subject = $subject;
} public function __call($method, $args) {
return call_user_func_array([$this->_subject, $method], $args);
} } // 客户端
class Client{ public static function proxy(){
$proxy = new ProxyWeather();
$proxy->display('beijing');
} public static function dynamic(){
$proxy = new DynamicProxyWeather(new RealWeather());
$proxy->display('beijing');
}
} Client::proxy();
Client::dynamic();

桥连模式

<?php
/**
* 桥连模式:实现系统在多个维度上的独立变化
Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。
它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
eg:显示器有21、23、27寸,颜色有黑色、白色、花色,通常做法会产生9个类[21黑,21白,21花,23黑,23白,23花,27黑,27白,27花],
如果使用Bridge模式,只需要6个类即可【21,23,27,黑色,白色,花色】
*/ // 尺寸基类
class BaseSize
{
protected $_size; public function setSize()
{
echo '尺寸是:' . $this->_size . '英寸;';
}
} // 颜色基类
class BaseColor
{
protected $_color; public function setColor()
{
echo '颜色是:' . $this->_color;
}
} class Size21 extends BaseSize
{
public function __construct()
{
$this->_size = 21;
}
} class Size23 extends BaseSize
{
public function __construct()
{
$this->_size = 23;
}
} class Size27 extends BaseSize
{
public function __construct()
{
$this->_size = 27;
}
} class ColorBlack extends BaseColor
{
public function __construct()
{
$this->_color = '黑色';
}
} class ColorWhite extends BaseColor
{
public function __construct()
{
$this->_color = '白色';
}
} class ColorSuit extends BaseColor
{
public function __construct()
{
$this->_color = '花色';
}
} class Client
{
public function buy()
{
echo '我要一台显示器:';
(new Size27())->setSize();
(new ColorWhite())->setColor();
}
} (new Client())->buy();
// 我要一台显示器:尺寸是:27英寸;颜色是:白色

门面(外观)模式

<?php

/**
* 外观(门面)模式:为了降低复杂性,常常将系统划分为若干个子系统,而一个功能常常是由子系统里面的若干个单元组合而成。
Facade模式定义了一个高层接口,这个接口又调用了子系统的多个类和方法。
这样,客户端只需要直接与Facade交互,客户端与子系统之间的复杂关系由Facade来实现,从而降低了系统的耦合度。
就是说,Facade对外隐藏了功能的具体实现细节,通过把这个功能的具体细节封装成一个接口让客户端调用。
Facade对象是外界访问子系统内部的唯一通道
*/ // 壳
class Shell
{
public function set()
{
echo '手机装上外壳';
}
} // 屏幕
class Screen
{
public function set()
{
echo '手机装上屏幕';
}
} // 电池
class Battery
{
public function set()
{
echo '手机装上电池';
}
} // 富士康
class Facade
{
// 组装手机
public static function product()
{
// 如果顺序需要变动或者需要新增其他部件,在这里修改即可 echo '开始组装手机'; (new Shell())->set();
(new Screen())->set();
(new Battery())->set(); echo '手机组装完成';
}
} // 苹果公司
class Client
{
public function show()
{
// 复杂的组装交给 Facade 处理
Facade::product();
}
} (new Client())->show();
// 开始组装
// 手机装上外壳
// 手机装上屏幕
// 手机装上电池
// 手机组装完成

php设计模式2的更多相关文章

  1. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. java EE设计模式简介

    1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...

  3. 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式

    上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...

  4. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  5. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  6. 设计模式之行为类模式大PK

                                        行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...

  7. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  8. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  9. java 设计模式

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...

  10. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

随机推荐

  1. C#冒泡法排序源码

    如下内容内容是关于C#冒泡法排序的内容,应该对码农有一些用途. int[] myArray = new int[] { 10, 8, 3, 5, 6, 7, 4, 6, 9 }; for( int j ...

  2. C#生成COM组件

    1.类库代码 1.1暴露的方法必须以接口的方式实现 1.2类需要GUID编号 using System; using System.Runtime.InteropServices; //COM组件 n ...

  3. RabbitMQ通过Exchange.fanout、不同的队列绑定同一个Exchange实现多播处理

    消费者1: static void Main(string[] args) { ConnectionFactory factory = new ConnectionFactory() { HostNa ...

  4. 031 一次全面的java复习

    一:相关概念 1.面向对象的三个特征 封装,继承,多态,这个应该是人人皆知,有时候也会加上抽象. 2.多态的好处 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性.简单的说 ...

  5. MongoDB安装之window版本的安装

    Windows 平台安装 MongoDB MongoDB 下载 MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制 ...

  6. redis对hash进行的相关操作

    redis对hash类型操作的相关命令以及如何在python使用这些命令 redis对hash类型操作的命令: 命令 语法 概述 返回值 Redis Hdel 命令 hdel key field [f ...

  7. Use try-with-resources

    public void doQueries() throws MyException{ // First try-with-resources. try ( Connection con = Driv ...

  8. sublime2 nodejs 执行编译无反应

    这个问题困扰了我得一周了,好不容易解决了, 一.问题描述: 安装网上的一些教程在sublime text 2 里面安装Nodejs 的编译环境,但是安装完之后执行编译没有任何输出信息,编译没有反应,只 ...

  9. DBUtils - Python数据库连接池

    flask没有ORM操作这一功能, 但是想要操作数据库怎么办呢, 使用第三方包DBUtils 查询需要SQL原生语句! DBUtils 第一步还是要下载 使用pycharm直接搜索DBUtils fr ...

  10. ARM的编程模式

    ARM的编程模式 Linux ARM的工作状态 (主要指指令模式) 基本概述 32位架构 指令相关 ARM 32bit Thumb指令 16bit Thumb-2 16||32 bit 兼容 复位后开 ...