装饰模式:

<?php
abstract class Tile {
abstract function getWealthFactor();
}
class Plains extends Tile {
private $wealthfactor = ;
function getWealthFactor() {
return $this->wealthfactor;
}
}
abstract class TileDecorator extends Tile { // 装饰
protected $tile;
function __construct( Tile $tile ) {
$this->tile = $tile;
}
}
class DiamondDecorator extends TileDecorator { // 钻石装饰
function getWealthFactor() {
return $this->tile->getWealthFactor()+;
}
}
class PollutionDecorator extends TileDecorator { // 污染装饰
function getWealthFactor() {
return $this->tile->getWealthFactor()-;
}
}
$tile = new Plains();
print $tile->getWealthFactor(); //
$tile = new DiamondDecorator( new Plains());
print $tile->getWealthFactor(); //
$tile = new PollutionDecorator( new DiamondDecorator( new Plains()));
print $tile->getWealthFactor(); //
?>

组合模式:

<?php
abstract class Unit {
abstract function bombardStrength();
}
class Archer extends Unit {
function bombardStrength() {
return ;
}
}
class LaserCannonUnit extends Unit {
function bombardStrength() {
return ;
}
}
class Army {
private $units = array();
private $armies= array();
function addUnit( Unit $unit ) {
array_push( $this->units, $unit );
}
function addArmy( Army $army ) {
array_push( $this->armies, $army );
}
function bombardStrength() {
$ret = ;
foreach( $this->units as $unit ) {
$ret += $unit->bombardStrength();
}
foreach( $this->armies as $army ) {
$ret += $army->bombardStrength();
}
return $ret;
}
}
$unit1 = new Archer();
$unit2 = new LaserCannonUnit();
$army = new Army();
$army->addUnit( $unit1 );
$army->addUnit( $unit2 );
print $army->bombardStrength();
print "\n";
$army2 = clone $army; // 克隆军队
$army->addArmy( $army2 );
print $army->bombardStrength();
print "\n";
?>

工厂模式

 <?php
/**
* 操作类
* 因为包含有抽象方法,所以类必须声明为抽象类
*/
abstract class Operation{
//抽象方法不能包含函数体
abstract public function getValue($num1,$num2);//强烈要求子类必须实现该功能函数
}
/**
* 加法类
*/
class OperationAdd extends Operation {
public function getValue($num1,$num2){
return $num1+$num2;
}
}
/**
* 减法类
*/
class OperationSub extends Operation {
public function getValue($num1,$num2){
return $num1-$num2;
}
}
/**
* 乘法类
*/
class OperationMul extends Operation {
public function getValue($num1,$num2){
return $num1*$num2;
}
}
/**
* 除法类
*/
class OperationDiv extends Operation {
public function getValue($num1,$num2){
try {
if ($num2==){
throw new Exception("除数不能为0");
}else {
return $num1/$num2;
}
}catch (Exception $e){
echo "错误信息:".$e->getMessage();
}
} /**
* 工厂类,主要用来创建对象
* 功能:根据输入的运算符号,工厂就能实例化出合适的对象
*
*/
class Factory{
public static function createObj($operate){
switch ($operate){
case '+':
return new OperationAdd();
break;
case '-':
return new OperationSub();
break;
case '*':
return new OperationSub();
break;
case '/':
return new OperationDiv();
break;
}
}
}
$test=Factory::createObj('/');
$result=$test->getValue(,);
echo $result;
?>

单例模式

<?php  

/**
* Singleton of Database
*/
class Database
{
// We need a static private variable to store a Database instance.
privatestatic $instance; // Mark as private to prevent it from being instanced.
private function__construct()
{
// Do nothing.
} private function__clone()
{
// Do nothing.
} public static function getInstance()
{
if (!(self::$instanceinstanceofself)) {
self::$instance = newself();
} returnself::$instance;
}
} $a =Database::getInstance();
$b =Database::getInstance(); // true
var_dump($a === $b);

策略模式

<?php
interface FlyBehavior{
public function fly();
} class FlyWithWings implements FlyBehavior{
public function fly(){
echo "Fly With Wings \n";
}
} class FlyWithNo implements FlyBehavior{
public function fly(){
echo "Fly With No Wings \n";
}
}
class Duck{
private $_flyBehavior;
public function performFly(){
$this->_flyBehavior->fly();
} public function setFlyBehavior(FlyBehavior $behavior){
$this->_flyBehavior = $behavior;
}
} class RubberDuck extends Duck{
}
// Test Case
$duck = new RubberDuck(); /* 想让鸭子用翅膀飞行 */
$duck->setFlyBehavior(new FlyWithWings());
$duck->performFly(); /* 想让鸭子不用翅膀飞行 */
$duck->setFlyBehavior(new FlyWithNo());
$duck->performFly(); ?>

适配器模式

class User {      

    private $name;      

    function __construct($name) {      

        $this->name = $name;      

    }      

    public function getName() {      

        return $this->name;      

    }      

}
//新代码,开放平台标准接口 interface UserInterface { function getUserName(); } class UserInfo implements UserInterface { protected $user; function __construct($user) { $this->user = $user; } public function getUserName() { return $this->user->getName(); } }
$olduser = new User('张三'); echo $olduser->getName()."n"; $newuser = new UserInfo($olduser); echo $newuser->getUserName()."n";

PHP常用设计模式汇总的更多相关文章

  1. Java常用英语汇总(面试必备)

    Java常用英语汇总(面试必备) abstract (关键字)             抽象 ['.bstr.kt] access                            vt.访问,存 ...

  2. 20145222《信息安全系统设计基础》Linux常用命令汇总

    学习Linux时常用命令汇总 通过Ctrl+f键可在该网页搜索到你想要的命令. Linux中命令格式为:command [options] [arguments] //中括号代表是可选的,即有些命令不 ...

  3. Oozie命令行常用命令汇总[转]

    Oozie命令行常用命令汇总 有时候脚本跑多了就不愿意在OozieWeb端去看脚本的运行情况了.还好Oozie提供了很多命令行命令.能通过命令行直接检索自己想看到的脚本信息.在这里简单进行一下总结.一 ...

  4. Android常用设计模式(二)

    Android常用设计模式之观察者模式 观察者设计模式在Android应用中会经常用到,模式原理类似于这样的场景: 用户订报纸,然后在报社登记,报社来统计用户(添加用户),用户也可以取消订阅,报社删除 ...

  5. 代码重构 & 常用设计模式

    代码重构 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1  新建一个方法 ...

  6. IOS开发常用设计模式

    IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...

  7. php常用函数汇总

    php常用函数汇总   字符串截取:           1.substr('要截取的字符串','从第几个字符开始','到第几个字符结束');             * 截取英文或者数字       ...

  8. JavaScript之Array常用函数汇总

    [20141121]JavaScript之Array常用功能汇总 *:first-child { margin-top: 0 !important; } body>*:last-child { ...

  9. vim常用命令汇总

    vim常用命令汇总: http://www.cnblogs.com/softwaretesting/archive/2011/07/12/2104435.html 定位 本行第一个字符 ctrl+$ ...

随机推荐

  1. SQL基础E-R图基础

    ER图分为实体.属性.关系三个核心部分.实体是长方形体现,而属性则是椭圆形,关系为菱形. ER图的实体(entity)即数据模型中的数据对象,例如人.学生.音乐都可以作为一个数据对象,用长方体来表示, ...

  2. 使用ffmpeg合并视频

    命令: ffmpeg -i concat:"1.avi|2.avi" -vcodec copy -acodec copy "3.avi" ffmpeg下载:ht ...

  3. 在Mac OS里安装和升级Git

    在此记录,给自己看,也给别人参考. 进入终端,查看当前Git版本,输入指令:git --version 输入which git回车,可以查看当前git在什么位置 经查,版本:2.10.0,版本较低,为 ...

  4. (转)嵌入式C开发人员的最好笔试题目

    约定:   1) 下面的测试题中,认为所有必须的头文件都已经正确的包含了    2)数据类型             char 一个字节 1 byte        int 两个字节 2 byte ( ...

  5. C++笔记-类层次结构

    多重继承 一个类采用多个直接基类的情况称为多重继承,采用一个基类就是单继承. 两个基类中可能会出现名字一样的成员函数 在派生类中就必须消解这两个基类的成员函数带来的歧义性,最好的方法:在派生类中重新定 ...

  6. C#关于如何修改项目文件夹名称

    在C# 中修改了解决方案项目名称之后,重命名之后出现错误形式: 解决方法就是 打开你的sln文件 ,将里面的地址改过来就好了 以记事本的方式打开.sln文件 修改其中的相对路径,下图选中部分的路径,这 ...

  7. HDU 2819 Swap (二分匹配+破输出)

    题意:给定上一个01矩阵,让你变成一个对角全是 1 的矩阵. 析:二分匹配,把行和列看成两个集合,用匈牙利算法就可以解决,主要是在输出解,在比赛时一紧张不知道怎么输出了. 输出应该是要把 match[ ...

  8. [译]Javascript timing事件

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  9. mysql在linux下的安装与优化

    mysql5.6 http://www.cnblogs.com/bookwed/p/5896619.html mysql5.7 http://blog.csdn.net/wb96a1007/artic ...

  10. Android源码、内核编译

    Android源码和内核的编译就是一场马拉松,每一个节点都耗时漫长,下载源码.编译源码.下载内核.编译内核,下载中途会断掉,编译中间会失败,求解再重来,又是一轮马拉松,于是每一步都要做好备份和记录,可 ...