太原PHP培训
达内太原php培训中心

0351-5608878

热门课程

PHP 读书笔记(二)

  • 时间:2016-11-01
  • 发布:简书
  • 来源:简书

PHP 读书笔记(二)

现在有很多热衷于学习php的人,但是对于学习就要有良好的学习笔记。太原php培训班为大家带来一篇。

介绍第一个概念 The Abstract Factory pattern

抽象工厂就是对于工厂方法的1+1=2的叠加。

如果我们的Document不止创建一个page,还要创建cover,那就会有两个create方法,此时每个子类就多实现一个方法的。

Repository Pattern

仓储模式:该模式在Eric Evan的神书:Domain-Driven Design: Tackling Complexity in the Heart of Software中详细的进行了描述

A REPOSITORY represents all objects of a certain type as a conceptual set (usuallyemulated). It acts like a collection, except with more elaborate querying capability.

Domain-Driven Design, Eric Evans, p. 151

仓储类似于一个数据集合,相比较集合有更多精细设计的query,当我们谈论Repository的时候,我们关注的不再是“querying the database”,而是更纯粹的目的:存取数据

常用的读取数据的方法

class MyRepository {

public function getById($id);

public function findById($id);

public function find($id);

public function retrieve($id);

}

常用的写方法:

class MyRepository {

public function persist($object);

public function save($object);

}

每个Repository对应一个类的存取,有多个类,就会有多个Repository

一个Repository怎么工作?

Objects of the appropriate type are added and removed, and the machinery behindthe REPOSITORY inserts them or deletes them from the database.

Domain-Driven Design, Eric Evans, p. 151

主要给出一些资源:

Dotrine ORM :实现了Date Mapper

Eloquent ORM , Propel :实现了Active Record

Zend Framework 2 :提供了Table Data Gateway模式

如果你想要自己实现一个Repository,强烈推荐 Patterns of Enterprise Application Architecture

关于数据库的各种模式,推荐一个 ppt

Adapter Pattern

直接看代码:

class GoogleMapsApi {

public function getWalkingDirections($from, $to) {}

}

interface DistanceInterface {

public function getDistance($from, $to);

}

class WalkingDistance implements DistanceInterface {

public function getDistance($from, $to) {

$api = new GoogleMapsApi();

$directions = $api->getWalkingDirections($from, $to);

return $directions->getTotalDistance();

}

}

适配器,非常明确的表名了意图,通过 WalkingDistance GoogleMapsApi适配为了DistanceInterface

Strategy Pattern

也是看代码:

public function invoiceCustomers(array $customers) {

foreach ($customers as $customer) {

$invoice = $this->invoiceFactory->create(

$customer,

$this->orderRepository->getByCustomer($customer)

);

// send invoice...

}

}

// 此处我们根据用仓库里获取到的用户账单,通知用户

interface InvoiceDeliveryInterface {

public function send(Invoice $invoice);

}

class EmailDeliveryStrategy implements InvoiceDeliveryInterface {

public function send(Invoice $invoice) {

// Use an email library to send it

}

}

class PrintDeliveryStrategy implements InvoiceDeliveryInterface {

public function send(Invoice $invoice) {

// Send it to the printer

}

}

// 账单有两种通知方式,一种是发邮件,一种是print

public function invoiceCustomers(array $customers) {

foreach ($customers as $customer) {

$invoice = $this->invoiceFactory->create(

$customer,

$this->orderRepository->getByCustomer($customer));

switch ($customer->getDeliveryMethod()) {

case 'email':

$strategy = new EmailDeliveryStrategy();

break;

case 'print':

default:

$strategy = new PrintDeliveryStrategy();

break;

}

$strategy->send($invoice);

}

}

// 通过策略模式:我们可以在runtime,根据不同的账单,选择而不同的发送策略

// 问题:发送策略的选择不应该在外部直接暴露,改选择什么通知策略,应该是用户自己知道的,因此就有了下面的代码:

class InvoiceDeliveryStrategyFactory {

public function create(Customer $customer) {

switch ($customer->getDeliveryMethod()) {

case 'email':

return new EmailDeliveryStrategy();

break;

case 'print':

default:

return new PrintDeliveryStrategy();

break;

}

}

}

// 此时的客户端,根据最少职责原则,此时invoiceCustomers值负责创建账单,并且发送,并不负责选择什么方式寄送

public function invoiceCustomers(array $customers) {

foreach ($customers as $customer) {

$invoice = $this->invoiceFactory->create(

$customer,

$this->orderRepository->getByCustomer($customer));

$strategy = $this->deliveryMethodFactory->create(

$customer);

$strategy->send($invoice);

}

}

更多的设计模式:

设计模式:可复用面向对象软件的基础

Head First Design Patterns

好了,今天就给大家讲这么多吧,喜欢我的内容可以关注或者分享(微信公众平台:tytedu)选择太原达内培训,不再孤军奋战,轻轻松松做IT高薪白领。太原达内培训带领有明确目标的学子迈向成功之路!

上一篇:PHP 读书笔记(一)
下一篇:继印度、韩国之后 蚂蚁金服再投泰国支付公司Ascend Money

太原php培训资源站

太原PHP编程开发并发编程槽与坑

Php开发规划自己的路

太原php培训老生常谈php

选择城市和中心
贵州省

广西省

海南省