145 php 设计模式代码和应用场景实例
2016-03-09 10:29
1541 查看
设计模式代码和应用场景实例
behavioral
templete(模板方法模式)
需求:某个方法的实现需要多个步骤(类似“请客”),其中有些步骤是固定的(类似“点单”和“买单”),而有些步骤并不固定,存在可变性(类似“吃东西”)。
注意点: 钩子方法有两类:第一类钩子方法可以与一些具体步骤“挂钩”,以实现在不同条件下执行模板方法中的不同步骤,这类钩子方法的返回类型通常是bool类型的,这类方法名一般为IsXXX(),如果条件满足则执行某一步骤,否则将不执行.还有一类钩子方法就是实现体为空的具体方法,子类可以根据需要覆盖或者继承这些钩子方法
creational
structural
Adapter(适配器模式)
需求:因为老系统改造需要重写用户类,但是新的用户类接口要和原有用户类接口不兼容,需要用新类的接口封装原有的接口
注意点:旧的对象通过成员变量方式传入,这里使用组合模式(有统一的生存期,实心菱形)解耦,也可以使用继承,但是耦合度太高
<?php //旧用户类 class User { // error_此处是private 用户名唯一 private $name; //是否是protected? 不是 //error_ 此处双下划线 //error_ 构造函数传入用户名 function __construct($name){ $this -> name = $name; } public function getName(){ return $this -> name; } } //error_ 此处需要用抽象类 interface UserInterface{ function getUserName(); } //error_ 此处继承接口 class UserInfo Implements UserInterface { // error_ 此处成员变量名是user protected $user; function __construct($user){ $this -> user = $user; } //error_ 此处不需要传入参数$user public function getUserName(){ return $this -> user -> getName(); } } $oldUser = new User(); echo "old_user_name =".$oldUser -> getName(); $newUser = new UserInterface($oldUser); //error_ 此处不需要传入参数$oldUser echo "still_old_user_name =".$newUser -> getUserName();
Bridge(桥接模式)
需求:你有一个电视机的接口,还有一个遥控器的抽象类。我们都知道,将它们中任何一个定义为一个具体类都不是好办法,因为其它厂家会有不同的实现方法。
注意点:一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。在有多种可能会变化的情况下,用继承会造成类爆炸问题.
<?php /** * workshop有两个行为子类 assemble 和 produce * vehicel 有两个子类 car 和 motorcycle */ interface Workshop { //error_ 接口函数为空则不需要大括号 function work(); } interface Vehicle { protected $workshop1; protected $workshop2; function __construct( Workshop $workshop1 , Workshop $workshop2){ $this -> workshop1 = $workshop1; $this -> workshop1 = $workshop2; } function manufacture(){ $this -> workshop1 ->work(); $this -> workshop2 ->work(); } } class Assemble implements Workshop{ public function work(){ echo "assembled" ; } } class Produce implements Workshop{ public function work(){ echo "Produced" ; } } // error_ 此处用extends继承 class Car extends Vehicle{ //error_ 此处无需再次声明成员变量 // protected $workshop1; // protected $workshop2; //error_ 此处沿用父类写法 对象类型+对象名 function __construct ( Workshop $workShop1, Workshop $workShop2){ //error_ 此处使用父类方法 parent::__construct ( $workShop1, $workShop2); // $this -> workshop1 = new Assemble(); // $this -> workshop2 = new Workshop(); } public function manufacture(){ echo 'Car '; return $this ->workshop1 ->work(); return $this ->workshop2 ->work(); } } // error_ 此处用extends继承 class Motorcycle extends Vehicle{ //error_ 此处无需再次声明成员变量 // protected $workshop1; // protected $workshop2; //error_ 此处沿用父类写法 对象类型+对象名 function __construct ( Workshop $workShop1, Workshop $workShop2){ //error_ 此处使用父类方法 parent::__construct ( $workShop1, $workShop2); // $this -> workshop1 = new Assemble(); // $this -> workshop2 = new Workshop(); } public function manufacture(){ echo 'Motorcycle '; return $this ->workshop1 ->work(); return $this ->workshop2 ->work(); } } class BridgeTest { public function testCar(){ $vehicle = new Car(new Produce(), new Assemble()); $vehicle->manufacture(); } public function testMotorcycle(){ $vehicle = new Motorcycle(new Produce(), new Assemble()); $vehicle->manufacture(); } }
相关文章推荐
- php判断是否是手机浏览器
- 如何同步时间ntp/rdate
- __FILE__和$_SERVER["PHP_SELF"]的区别
- PHP学习SELECT postgresql正则表达式 cookie同一站点IP访问和域名访问 T检验
- win7 64位下wampserver打开php扩展php_oci8和php_pdo_oci失败的问题
- PHP 正则表达式
- PHP常量详解:define和const的区别
- phpstorm中$_post无法传值的问题 与文件无法上传问题
- PHP字面量与标识符
- ord函数-php
- phpmyadmin误删表后的恢复过程
- php 防sql注入?
- [PHP]利用XAMPP搭建本地服务器, 然后利用iOS客户端上传数据到本地服务器中(二.配置MySQL数据库)
- ubuntu搭建ftp服务器
- PhpStorm等Jetbrains软件git无法push问题解决
- php注册登录系统简化版
- Zend Framework教程之Loader以及PluginLoader用法详解
- PHP获取上周、本周、上月、本月、本季度、上季度时间方法大全
- laravel composer安装学习
- php array_shift() array_pop array_slice