课程咨询 :13623629309

太原PHP培训 > 达内新闻 > PHP 读书笔记(二)
  • 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高级开发名企定制班(剩2个名额)

php高级开发名企定制班(剩2个名额)

开班日期:12-30

php高级开发周末班(剩5个名额)

php高级开发周末班(剩5个名额)

开班日期:12-30

php高级开发免费试听(剩5个名额)

php高级开发免费试听(剩5个名额)

开班日期:12-30

更多高级开发工程师精品班

更多高级开发工程师精品班

开班日期:12-30

  • 地址:山西省太原市小店区学府街长治路高新国际A座24层
  • 课程培训电话:13623629309     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56

    在线客服系统