From c6cc7f21318c78d1591c01eaa7a27c63540e8eed Mon Sep 17 00:00:00 2001 From: Faust Date: Thu, 2 Apr 2015 00:02:43 +0200 Subject: [PATCH 01/14] create read-the-docs.sh --- read-the-docs.sh | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100755 read-the-docs.sh diff --git a/read-the-docs.sh b/read-the-docs.sh new file mode 100755 index 0000000..e868670 --- /dev/null +++ b/read-the-docs.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# Step 1 use pandoc to convert README.md to index.rst +find . -type f -name "README.md" \ + -execdir pandoc -f markdown -t rst -s -o "index.rst" {} \; \ +# -delete + +# Step 2 move uml/* of every pattern to images/path_to_pattern/uml/* +#find . -type d -name "uml" \ +# -exec bash -c 'mkdir -p images/${1:2}' funcname {} \; \ +# -exec bash -c 'mv ${1}/* images/${1:2}' funcname {} \; \ +# -delete + +# Step 3 change the content of index.rst +# embed php files in index.rst +for INDEX in $(find . -type f -name "index.rst") +do + # fix figure to image, add align center + sed -i "s|.. figure::|.. image::|g" ${INDEX} + sed -i "/:alt:/{n;d}" ${INDEX} + sed -i "s| Alt.*| :align: center|" ${INDEX} + + BASEDIR=$(dirname ${INDEX}) + + # fix image path uml/uml.png to images/path_to_pattern/uml/uml.png + # sed -i "s|uml/uml.png|/images/${BASEDIR:2}/uml/uml.png|g" ${INDEX} + + # embed pattern files + echo -e "\nCode\n----\n" >> ${INDEX} + echo -e "You can also find these code on \`GitHub\`_\n" >> ${INDEX} + + for PHPFILE in $(find ${BASEDIR} -maxdepth 1 -type f -name "*.php") + do + echo -e "$(basename ${PHPFILE})\n" >> ${INDEX} + echo -e ".. literalinclude:: $(basename ${PHPFILE})\n :language: php\n :linenos:\n" >> ${INDEX} + done + + # embed test files + echo -e "Test\n----\n" >> ${INDEX} + + for TESTFILE in $(find ${BASEDIR}/Tests -maxdepth 1 -type f -name "*.php") + do + echo -e "Tests/$(basename ${TESTFILE})\n" >> ${INDEX} + echo -e ".. literalinclude:: Tests/$(basename ${TESTFILE})\n :language: php\n :linenos:\n" >> ${INDEX} + done + + # add link on GitHub of this pattern + echo -e ".. _\`GitHub\`: https://github.com/domnikl/DesignPatternsPHP/tree/master/${BASEDIR:2}" >> ${INDEX} +done + +# Step 4 embed other php files in index.rst +# fix TocTree of projet \ No newline at end of file From bba8b0df4321ed60c35b247201ff20bcf5deb8f5 Mon Sep 17 00:00:00 2001 From: Faust Date: Thu, 2 Apr 2015 00:03:33 +0200 Subject: [PATCH 02/14] execute read-the-docs.sh --- Behavioral/ChainOfResponsibilities/index.rst | 57 +++++++ Behavioral/Command/index.rst | 76 +++++++++ Behavioral/Iterator/index.rst | 69 +++++++++ Behavioral/Mediator/index.rst | 54 +++++++ Behavioral/Memento/index.rst | 67 ++++++++ Behavioral/NullObject/index.rst | 74 +++++++++ Behavioral/Observer/index.rst | 57 +++++++ Behavioral/Specification/index.rst | 75 +++++++++ Behavioral/State/index.rst | 56 +++++++ Behavioral/Strategy/index.rst | 70 +++++++++ Behavioral/TemplateMethod/index.rst | 63 ++++++++ Behavioral/Visitor/index.rst | 67 ++++++++ Behavioral/index.rst | 40 +++++ Creational/AbstractFactory/index.rst | 69 +++++++++ Creational/Builder/Parts/index.rst | 53 +++++++ Creational/Builder/index.rst | 68 +++++++++ Creational/FactoryMethod/index.rst | 82 ++++++++++ Creational/Multiton/index.rst | 40 +++++ Creational/Pool/index.rst | 69 +++++++++ Creational/Prototype/index.rst | 55 +++++++ Creational/SimpleFactory/index.rst | 60 ++++++++ Creational/Singleton/index.rst | 49 ++++++ Creational/StaticFactory/index.rst | 64 ++++++++ Creational/index.rst | 36 +++++ More/Delegation/index.rst | 53 +++++++ More/Repository/index.rst | 61 ++++++++ More/ServiceLocator/index.rst | 83 ++++++++++ More/index.rst | 18 +++ Structural/Adapter/index.rst | 70 +++++++++ Structural/Bridge/index.rst | 70 +++++++++ Structural/Composite/index.rst | 64 ++++++++ Structural/DataMapper/index.rst | 59 +++++++ Structural/Decorator/index.rst | 67 ++++++++ Structural/DependencyInjection/index.rst | 87 +++++++++++ Structural/Facade/index.rst | 65 ++++++++ Structural/FluentInterface/index.rst | 45 ++++++ Structural/Proxy/index.rst | 43 ++++++ Structural/Registry/index.rst | 46 ++++++ Structural/index.rst | 37 +++++ index.rst | 153 +++++++++++++++++++ 40 files changed, 2491 insertions(+) create mode 100644 Behavioral/ChainOfResponsibilities/index.rst create mode 100644 Behavioral/Command/index.rst create mode 100644 Behavioral/Iterator/index.rst create mode 100644 Behavioral/Mediator/index.rst create mode 100644 Behavioral/Memento/index.rst create mode 100644 Behavioral/NullObject/index.rst create mode 100644 Behavioral/Observer/index.rst create mode 100644 Behavioral/Specification/index.rst create mode 100644 Behavioral/State/index.rst create mode 100644 Behavioral/Strategy/index.rst create mode 100644 Behavioral/TemplateMethod/index.rst create mode 100644 Behavioral/Visitor/index.rst create mode 100644 Behavioral/index.rst create mode 100644 Creational/AbstractFactory/index.rst create mode 100644 Creational/Builder/Parts/index.rst create mode 100644 Creational/Builder/index.rst create mode 100644 Creational/FactoryMethod/index.rst create mode 100644 Creational/Multiton/index.rst create mode 100644 Creational/Pool/index.rst create mode 100644 Creational/Prototype/index.rst create mode 100644 Creational/SimpleFactory/index.rst create mode 100644 Creational/Singleton/index.rst create mode 100644 Creational/StaticFactory/index.rst create mode 100644 Creational/index.rst create mode 100644 More/Delegation/index.rst create mode 100644 More/Repository/index.rst create mode 100644 More/ServiceLocator/index.rst create mode 100644 More/index.rst create mode 100644 Structural/Adapter/index.rst create mode 100644 Structural/Bridge/index.rst create mode 100644 Structural/Composite/index.rst create mode 100644 Structural/DataMapper/index.rst create mode 100644 Structural/Decorator/index.rst create mode 100644 Structural/DependencyInjection/index.rst create mode 100644 Structural/Facade/index.rst create mode 100644 Structural/FluentInterface/index.rst create mode 100644 Structural/Proxy/index.rst create mode 100644 Structural/Registry/index.rst create mode 100644 Structural/index.rst create mode 100644 index.rst diff --git a/Behavioral/ChainOfResponsibilities/index.rst b/Behavioral/ChainOfResponsibilities/index.rst new file mode 100644 index 0000000..c838a29 --- /dev/null +++ b/Behavioral/ChainOfResponsibilities/index.rst @@ -0,0 +1,57 @@ +Chain Of Responsibilities +========================= + +Purpose: +-------- + +To build a chain of objects to handle a call in sequential order. If one +object cannot handle a call, it delegates the call to the next in the +chain and so forth. + +Examples: +--------- + +- logging framework, where each chain element decides autonomously what + to do with a log message +- a Spam filter +- Caching: first object is an instance of e.g. a Memcached Interface, + if that "misses" it delegates the call to the database interface +- Yii Framework: CFilterChain is a chain of controller action filters. + the executing point is passed from one filter to the next along the + chain, and only if all filters say "yes", the action can be invoked + at last. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt ChainOfResponsibility UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Handler.php + +.. literalinclude:: Handler.php + :language: php + :linenos: + +Request.php + +.. literalinclude:: Request.php + :language: php + :linenos: + +Test +---- + +Tests/ChainTest.php + +.. literalinclude:: Tests/ChainTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/ChainOfResponsibilities diff --git a/Behavioral/Command/index.rst b/Behavioral/Command/index.rst new file mode 100644 index 0000000..5056f13 --- /dev/null +++ b/Behavioral/Command/index.rst @@ -0,0 +1,76 @@ +Command +======= + +Purpose +------- + +To encapsulate invocation and decoupling. + +We have an Invoker and a Receiver. This pattern uses a "Command" to +delegate the method call against the Receiver and presents the same +method "execute". Therefore, the Invoker just knows to call "execute" to +process the Command of the client. The Receiver is decoupled from the +Invoker. + +The second aspect of this pattern is the undo(), which undoes the method +execute(). Command can also be aggregated to combine more complex +commands with minimum copy-paste and relying on composition over +inheritance. + +Examples +-------- + +- A text editor : all events are Command which can be undone, stacked + and saved. +- Symfony2: SF2 Commands that can be run from the CLI are built with + just the Command pattern in mind +- big CLI tools use subcommands to distribute various tasks and pack + them in "modules", each of these can be implemented with the Command + pattern (e.g. vagrant) + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Command UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +HelloCommand.php + +.. literalinclude:: HelloCommand.php + :language: php + :linenos: + +Receiver.php + +.. literalinclude:: Receiver.php + :language: php + :linenos: + +CommandInterface.php + +.. literalinclude:: CommandInterface.php + :language: php + :linenos: + +Invoker.php + +.. literalinclude:: Invoker.php + :language: php + :linenos: + +Test +---- + +Tests/CommandTest.php + +.. literalinclude:: Tests/CommandTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Command diff --git a/Behavioral/Iterator/index.rst b/Behavioral/Iterator/index.rst new file mode 100644 index 0000000..6241bc8 --- /dev/null +++ b/Behavioral/Iterator/index.rst @@ -0,0 +1,69 @@ +Iterator +======== + +Purpose +------- + +To make an object iterable and to make it appear like a collection of +objects. + +Examples +-------- + +- to process a file line by line by just running over all lines (which + have an object representation) for a file (which of course is an + object, too) + +Note +---- + +Standard PHP Library (SPL) defines an interface Iterator which is best +suited for this! Often you would want to implement the Countable +interface too, to allow ``count($object)`` on your iterable object + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Iterator UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +BookList.php + +.. literalinclude:: BookList.php + :language: php + :linenos: + +BookListReverseIterator.php + +.. literalinclude:: BookListReverseIterator.php + :language: php + :linenos: + +BookListIterator.php + +.. literalinclude:: BookListIterator.php + :language: php + :linenos: + +Book.php + +.. literalinclude:: Book.php + :language: php + :linenos: + +Test +---- + +Tests/IteratorTest.php + +.. literalinclude:: Tests/IteratorTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Iterator diff --git a/Behavioral/Mediator/index.rst b/Behavioral/Mediator/index.rst new file mode 100644 index 0000000..7df0287 --- /dev/null +++ b/Behavioral/Mediator/index.rst @@ -0,0 +1,54 @@ +Mediator +======== + +Purpose +------- + +This pattern provides an easy to decouple many components working +together. It is a good alternative over Observer IF you have a "central +intelligence", like a controller (but not in the sense of the MVC). + +All components (called Colleague) are only coupled to the +MediatorInterface and it is a good thing because in OOP, one good friend +is better than many. This is the key-feature of this pattern. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Mediator UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +MediatorInterface.php + +.. literalinclude:: MediatorInterface.php + :language: php + :linenos: + +Mediator.php + +.. literalinclude:: Mediator.php + :language: php + :linenos: + +Colleague.php + +.. literalinclude:: Colleague.php + :language: php + :linenos: + +Test +---- + +Tests/MediatorTest.php + +.. literalinclude:: Tests/MediatorTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Mediator diff --git a/Behavioral/Memento/index.rst b/Behavioral/Memento/index.rst new file mode 100644 index 0000000..9d28f27 --- /dev/null +++ b/Behavioral/Memento/index.rst @@ -0,0 +1,67 @@ +Memento +======= + +Purpose +------- + +Provide the ability to restore an object to its previous state (undo via +rollback). + +The memento pattern is implemented with three objects: the originator, a +caretaker and a memento. The originator is some object that has an +internal state. The caretaker is going to do something to the +originator, but wants to be able to undo the change. The caretaker first +asks the originator for a memento object. Then it does whatever +operation (or sequence of operations) it was going to do. To roll back +to the state before the operations, it returns the memento object to the +originator. The memento object itself is an opaque object (one which the +caretaker cannot, or should not, change). When using this pattern, care +should be taken if the originator may change other objects or resources +- the memento pattern operates on a single object. + +Examples +-------- + +- The seed of a pseudorandom number generator +- The state in a finite state machine + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Momento UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Caretaker.php + +.. literalinclude:: Caretaker.php + :language: php + :linenos: + +Memento.php + +.. literalinclude:: Memento.php + :language: php + :linenos: + +Originator.php + +.. literalinclude:: Originator.php + :language: php + :linenos: + +Test +---- + +Tests/MementoTest.php + +.. literalinclude:: Tests/MementoTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Memento diff --git a/Behavioral/NullObject/index.rst b/Behavioral/NullObject/index.rst new file mode 100644 index 0000000..eb13a56 --- /dev/null +++ b/Behavioral/NullObject/index.rst @@ -0,0 +1,74 @@ +Null Object +=========== + +Purpose +------- + +NullObject is not a GoF design pattern but a schema which appears +frequently enough to be considered a pattern. It has the following +benefits: + +- Client code is simplified +- Reduces the chance of null pointer exceptions +- Fewer conditionals require less test cases + +Methods that return an object or null should instead return an object or +``NullObject``. ``NullObject``\ s simplify boilerplate code such as +``if (!is_null($obj)) { $obj->callSomething(); }`` to just +``$obj->callSomething();`` by eliminating the conditional check in +client code. + +Examples +-------- + +- Symfony2: null logger of profiler +- Symfony2: null output in Symfony/Console +- null handler in a Chain of Responsibilities pattern +- null command in a Command pattern + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt NullObject UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +PrintLogger.php + +.. literalinclude:: PrintLogger.php + :language: php + :linenos: + +NullLogger.php + +.. literalinclude:: NullLogger.php + :language: php + :linenos: + +Service.php + +.. literalinclude:: Service.php + :language: php + :linenos: + +LoggerInterface.php + +.. literalinclude:: LoggerInterface.php + :language: php + :linenos: + +Test +---- + +Tests/LoggerTest.php + +.. literalinclude:: Tests/LoggerTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/NullObject diff --git a/Behavioral/Observer/index.rst b/Behavioral/Observer/index.rst new file mode 100644 index 0000000..c14c448 --- /dev/null +++ b/Behavioral/Observer/index.rst @@ -0,0 +1,57 @@ +Observer +======== + +Purpose +------- + +To implement a publish/subscribe behaviour to an object, whenever a +"Subject" object changes it's state, the attached "Observers" will be +notified. It is used to shorten the amount of coupled objects and uses +loose coupling instead. + +Examples +-------- + +- a message queue system is observed to show the progress of a job in a + GUI + +Note +---- + +PHP already defines two interfaces that can help to implement this +pattern: SplObserver and SplSubject. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Observer UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +UserObserver.php + +.. literalinclude:: UserObserver.php + :language: php + :linenos: + +User.php + +.. literalinclude:: User.php + :language: php + :linenos: + +Test +---- + +Tests/ObserverTest.php + +.. literalinclude:: Tests/ObserverTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Observer diff --git a/Behavioral/Specification/index.rst b/Behavioral/Specification/index.rst new file mode 100644 index 0000000..6923159 --- /dev/null +++ b/Behavioral/Specification/index.rst @@ -0,0 +1,75 @@ +Specification +============= + +Purpose +------- + +Builds a clear specification of business rules, where objects can be +checked against. The composite specification class has one method called +``isSatisfiedBy`` that returns either true or false depending on whether +the given object satisfies the specification. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Specification UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Either.php + +.. literalinclude:: Either.php + :language: php + :linenos: + +PriceSpecification.php + +.. literalinclude:: PriceSpecification.php + :language: php + :linenos: + +SpecificationInterface.php + +.. literalinclude:: SpecificationInterface.php + :language: php + :linenos: + +AbstractSpecification.php + +.. literalinclude:: AbstractSpecification.php + :language: php + :linenos: + +Item.php + +.. literalinclude:: Item.php + :language: php + :linenos: + +Plus.php + +.. literalinclude:: Plus.php + :language: php + :linenos: + +Not.php + +.. literalinclude:: Not.php + :language: php + :linenos: + +Test +---- + +Tests/SpecificationTest.php + +.. literalinclude:: Tests/SpecificationTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Specification diff --git a/Behavioral/State/index.rst b/Behavioral/State/index.rst new file mode 100644 index 0000000..0b679c2 --- /dev/null +++ b/Behavioral/State/index.rst @@ -0,0 +1,56 @@ +State +===== + +Purpose +------- + +Encapsulate varying behavior for the same routine based on an object's +state. This can be a cleaner way for an object to change its behavior at +runtime without resorting to large monolithic conditional statements. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt State UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +OrderInterface.php + +.. literalinclude:: OrderInterface.php + :language: php + :linenos: + +OrderFactory.php + +.. literalinclude:: OrderFactory.php + :language: php + :linenos: + +OrderController.php + +.. literalinclude:: OrderController.php + :language: php + :linenos: + +ShippingOrder.php + +.. literalinclude:: ShippingOrder.php + :language: php + :linenos: + +CreateOrder.php + +.. literalinclude:: CreateOrder.php + :language: php + :linenos: + +Test +---- + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/State diff --git a/Behavioral/Strategy/index.rst b/Behavioral/Strategy/index.rst new file mode 100644 index 0000000..c1a2fe3 --- /dev/null +++ b/Behavioral/Strategy/index.rst @@ -0,0 +1,70 @@ +Strategy +======== + +Terminology: +------------ + +- Context +- Strategy +- Concrete Strategy + +Purpose +------- + +To separate strategies and to enable fast switching between them. Also +this pattern is a good alternative to inheritance (instead of having an +abstract class that is extended). + +Examples +-------- + +- sorting a list of objects, one strategy by date, the other by id +- simplify unit testing: e.g. switching between file and in-memory + storage + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Strategy UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +DateComparator.php + +.. literalinclude:: DateComparator.php + :language: php + :linenos: + +IdComparator.php + +.. literalinclude:: IdComparator.php + :language: php + :linenos: + +ObjectCollection.php + +.. literalinclude:: ObjectCollection.php + :language: php + :linenos: + +ComparatorInterface.php + +.. literalinclude:: ComparatorInterface.php + :language: php + :linenos: + +Test +---- + +Tests/StrategyTest.php + +.. literalinclude:: Tests/StrategyTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Strategy diff --git a/Behavioral/TemplateMethod/index.rst b/Behavioral/TemplateMethod/index.rst new file mode 100644 index 0000000..f3be5bc --- /dev/null +++ b/Behavioral/TemplateMethod/index.rst @@ -0,0 +1,63 @@ +Template Method +=============== + +Purpose +------- + +Template Method is a behavioral design pattern. + +Perhaps you have encountered it many times already. The idea is to let +subclasses of this abstract template "finish" the behavior of an +algorithm. + +A.k.a the "Hollywood principle": "Don't call us, we call you." This +class is not called by subclasses but the inverse. How? With abstraction +of course. + +In other words, this is a skeleton of algorithm, well-suited for +framework libraries. The user has just to implement one method and the +superclass do the job. + +It is an easy way to decouple concrete classes and reduce copy-paste, +that's why you'll find it everywhere. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt TemplateMethod UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +CityJourney.php + +.. literalinclude:: CityJourney.php + :language: php + :linenos: + +Journey.php + +.. literalinclude:: Journey.php + :language: php + :linenos: + +BeachJourney.php + +.. literalinclude:: BeachJourney.php + :language: php + :linenos: + +Test +---- + +Tests/JourneyTest.php + +.. literalinclude:: Tests/JourneyTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/TemplateMethod diff --git a/Behavioral/Visitor/index.rst b/Behavioral/Visitor/index.rst new file mode 100644 index 0000000..85fb280 --- /dev/null +++ b/Behavioral/Visitor/index.rst @@ -0,0 +1,67 @@ +Visitor +======= + +Purpose +------- + +The Visitor Pattern lets you outsource operations on objects to other +objects. The main reason to do this is to keep a separation of concerns. +But classes have to define a contract to allow visitors (the +``Role::accept`` method in the example). + +The contract is an abstract class but you can have also a clean +interface. In that case, each Visitor has to choose itself which method +to invoke on the visitor. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Visitor UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Group.php + +.. literalinclude:: Group.php + :language: php + :linenos: + +Role.php + +.. literalinclude:: Role.php + :language: php + :linenos: + +RolePrintVisitor.php + +.. literalinclude:: RolePrintVisitor.php + :language: php + :linenos: + +User.php + +.. literalinclude:: User.php + :language: php + :linenos: + +RoleVisitorInterface.php + +.. literalinclude:: RoleVisitorInterface.php + :language: php + :linenos: + +Test +---- + +Tests/VisitorTest.php + +.. literalinclude:: Tests/VisitorTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Visitor diff --git a/Behavioral/index.rst b/Behavioral/index.rst new file mode 100644 index 0000000..5691a0d --- /dev/null +++ b/Behavioral/index.rst @@ -0,0 +1,40 @@ +Behavioral +========== + +In software engineering, behavioral design patterns are design patterns +that identify common communication patterns between objects and realize +these patterns. By doing so, these patterns increase flexibility in +carrying out this communication. + +- `ChainOfResponsibilities `__ + `:notebook: `__ +- `Command `__ + `:notebook: `__ +- `Iterator `__ + `:notebook: `__ +- `Mediator `__ + `:notebook: `__ +- `NullObject `__ + `:notebook: `__ +- `Observer `__ + `:notebook: `__ +- `Specification `__ + `:notebook: `__ +- `State `__ + `:notebook: `__ +- `Strategy `__ + `:notebook: `__ +- `TemplateMethod `__ + `:notebook: `__ +- `Visitor `__ + `:notebook: `__ + +Code +---- + +You can also find these code on `GitHub`_ + +Test +---- + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral diff --git a/Creational/AbstractFactory/index.rst b/Creational/AbstractFactory/index.rst new file mode 100644 index 0000000..707968c --- /dev/null +++ b/Creational/AbstractFactory/index.rst @@ -0,0 +1,69 @@ +Abstract Factory +================ + +Purpose +------- + +To create series of related or dependent objects without specifying +their concrete classes. Usually the created classes all implement the +same interface. The client of the abstract factory does not care about +how these objects are created, he just knows how they go together. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt AbstractFactory UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Text.php + +.. literalinclude:: Text.php + :language: php + :linenos: + +JsonFactory.php + +.. literalinclude:: JsonFactory.php + :language: php + :linenos: + +AbstractFactory.php + +.. literalinclude:: AbstractFactory.php + :language: php + :linenos: + +MediaInterface.php + +.. literalinclude:: MediaInterface.php + :language: php + :linenos: + +HtmlFactory.php + +.. literalinclude:: HtmlFactory.php + :language: php + :linenos: + +Picture.php + +.. literalinclude:: Picture.php + :language: php + :linenos: + +Test +---- + +Tests/AbstractFactoryTest.php + +.. literalinclude:: Tests/AbstractFactoryTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/AbstractFactory diff --git a/Creational/Builder/Parts/index.rst b/Creational/Builder/Parts/index.rst new file mode 100644 index 0000000..8760de0 --- /dev/null +++ b/Creational/Builder/Parts/index.rst @@ -0,0 +1,53 @@ +Purpose +======= + +Examples +======== + +- + +Code +---- + +You can also find these code on `GitHub`_ + +Wheel.php + +.. literalinclude:: Wheel.php + :language: php + :linenos: + +Door.php + +.. literalinclude:: Door.php + :language: php + :linenos: + +Car.php + +.. literalinclude:: Car.php + :language: php + :linenos: + +Bike.php + +.. literalinclude:: Bike.php + :language: php + :linenos: + +Vehicle.php + +.. literalinclude:: Vehicle.php + :language: php + :linenos: + +Engine.php + +.. literalinclude:: Engine.php + :language: php + :linenos: + +Test +---- + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Builder/Parts diff --git a/Creational/Builder/index.rst b/Creational/Builder/index.rst new file mode 100644 index 0000000..b636e01 --- /dev/null +++ b/Creational/Builder/index.rst @@ -0,0 +1,68 @@ +Builder +======= + +Purpose +------- + +Builder is an interface that build parts of a complex object. + +Sometimes, if the builder has a better knowledge of what it builds, this +interface could be an abstract class with default methods (aka adapter). + +If you have a complex inheritance tree for objects, it is logical to +have a complex inheritance tree for builders too. + +Note: Builders have often a fluent interface, see the mock builder of +PHPUnit for example. + +Examples +-------- + +- PHPUnit: Mock Builder + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Builder UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +BuilderInterface.php + +.. literalinclude:: BuilderInterface.php + :language: php + :linenos: + +CarBuilder.php + +.. literalinclude:: CarBuilder.php + :language: php + :linenos: + +Director.php + +.. literalinclude:: Director.php + :language: php + :linenos: + +BikeBuilder.php + +.. literalinclude:: BikeBuilder.php + :language: php + :linenos: + +Test +---- + +Tests/DirectorTest.php + +.. literalinclude:: Tests/DirectorTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Builder diff --git a/Creational/FactoryMethod/index.rst b/Creational/FactoryMethod/index.rst new file mode 100644 index 0000000..693321f --- /dev/null +++ b/Creational/FactoryMethod/index.rst @@ -0,0 +1,82 @@ +Factory Method +============== + +Purpose +------- + +The good point over the SimpleFactory is you can subclass it to +implement different ways to create objects + +For simple case, this abstract class could be just an interface + +This pattern is a "real" Design Pattern because it achieves the +"Dependency Inversion Principle" a.k.a the "D" in S.O.L.I.D principles. + +It means the FactoryMethod class depends on abstractions, not concrete +classes. This is the real trick compared to SimpleFactory or +StaticFactory. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt FactoryMethod UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Porsche.php + +.. literalinclude:: Porsche.php + :language: php + :linenos: + +GermanFactory.php + +.. literalinclude:: GermanFactory.php + :language: php + :linenos: + +ItalianFactory.php + +.. literalinclude:: ItalianFactory.php + :language: php + :linenos: + +VehicleInterface.php + +.. literalinclude:: VehicleInterface.php + :language: php + :linenos: + +FactoryMethod.php + +.. literalinclude:: FactoryMethod.php + :language: php + :linenos: + +Bicycle.php + +.. literalinclude:: Bicycle.php + :language: php + :linenos: + +Ferrari.php + +.. literalinclude:: Ferrari.php + :language: php + :linenos: + +Test +---- + +Tests/FactoryMethodTest.php + +.. literalinclude:: Tests/FactoryMethodTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/FactoryMethod diff --git a/Creational/Multiton/index.rst b/Creational/Multiton/index.rst new file mode 100644 index 0000000..66b8764 --- /dev/null +++ b/Creational/Multiton/index.rst @@ -0,0 +1,40 @@ +Multiton +======== + +**THIS IS CONSIDERED TO BE AN ANTI-PATTERN! FOR BETTER TESTABILITY AND +MAINTAINABILITY USE DEPENDENCY INJECTION!** + +Purpose +======= + +To have only a list of named instances that are used, like a singleton +but with n instances. + +Examples +======== + +- 2 DB Connectors, e.g. one for MySQL, the other for SQLite +- multiple Loggers (one for debug messages, one for errors) + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Multiton UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Multiton.php + +.. literalinclude:: Multiton.php + :language: php + :linenos: + +Test +---- + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Multiton diff --git a/Creational/Pool/index.rst b/Creational/Pool/index.rst new file mode 100644 index 0000000..30d3be0 --- /dev/null +++ b/Creational/Pool/index.rst @@ -0,0 +1,69 @@ +Pool +==== + +The **object pool pattern** is a software creational design pattern that +uses a set of initialized objects kept ready to use – a "pool" – rather +than allocating and destroying them on demand. A client of the pool will +request an object from the pool and perform operations on the returned +object. When the client has finished, it returns the object, which is a +specific type of factory object, to the pool rather than destroying it. + +Object pooling can offer a significant performance boost in situations +where the cost of initializing a class instance is high, the rate of +instantiation of a class is high, and the number of instances in use at +any one time is low. The pooled object is obtained in predictable time +when creation of the new objects (especially over network) may take +variable time. + +However these benefits are mostly true for objects that are expensive +with respect to time, such as database connections, socket connections, +threads and large graphic objects like fonts or bitmaps. In certain +situations, simple object pooling (that hold no external resources, but +only occupy memory) may not be efficient and could decrease performance. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Pool UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Pool.php + +.. literalinclude:: Pool.php + :language: php + :linenos: + +Processor.php + +.. literalinclude:: Processor.php + :language: php + :linenos: + +Worker.php + +.. literalinclude:: Worker.php + :language: php + :linenos: + +Test +---- + +Tests/TestWorker.php + +.. literalinclude:: Tests/TestWorker.php + :language: php + :linenos: + +Tests/PoolTest.php + +.. literalinclude:: Tests/PoolTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Pool diff --git a/Creational/Prototype/index.rst b/Creational/Prototype/index.rst new file mode 100644 index 0000000..31a98a3 --- /dev/null +++ b/Creational/Prototype/index.rst @@ -0,0 +1,55 @@ +Prototype +========= + +Purpose +------- + +To avoid the cost of creating objects the standard way (new Foo()) and +instead create a prototype and clone it. + +Examples +-------- + +- Large amounts of data (e.g. create 1,000,000 rows in a database at + once via a ORM). + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Prototype UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +BookPrototype.php + +.. literalinclude:: BookPrototype.php + :language: php + :linenos: + +BarBookPrototype.php + +.. literalinclude:: BarBookPrototype.php + :language: php + :linenos: + +index.php + +.. literalinclude:: index.php + :language: php + :linenos: + +FooBookPrototype.php + +.. literalinclude:: FooBookPrototype.php + :language: php + :linenos: + +Test +---- + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Prototype diff --git a/Creational/SimpleFactory/index.rst b/Creational/SimpleFactory/index.rst new file mode 100644 index 0000000..ff55711 --- /dev/null +++ b/Creational/SimpleFactory/index.rst @@ -0,0 +1,60 @@ +Simple Factory +============== + +Purpose +------- + +ConcreteFactory is a simple factory pattern. + +It differs from the static factory because it is NOT static and as you +know: static => global => evil! + +Therefore, you can have multiple factories, differently parametrized, +you can subclass it and you can mock-up it. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt SimpleFactory UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +ConcreteFactory.php + +.. literalinclude:: ConcreteFactory.php + :language: php + :linenos: + +VehicleInterface.php + +.. literalinclude:: VehicleInterface.php + :language: php + :linenos: + +Scooter.php + +.. literalinclude:: Scooter.php + :language: php + :linenos: + +Bicycle.php + +.. literalinclude:: Bicycle.php + :language: php + :linenos: + +Test +---- + +Tests/SimpleFactoryTest.php + +.. literalinclude:: Tests/SimpleFactoryTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/SimpleFactory diff --git a/Creational/Singleton/index.rst b/Creational/Singleton/index.rst new file mode 100644 index 0000000..7393782 --- /dev/null +++ b/Creational/Singleton/index.rst @@ -0,0 +1,49 @@ +Singleton +========= + +**THIS IS CONSIDERED TO BE AN ANTI-PATTERN! FOR BETTER TESTABILITY AND +MAINTAINABILITY USE DEPENDENCY INJECTION!** + +Purpose +------- + +To have only one instance of this object in the application that will +handle all calls. + +Examples +-------- + +- DB Connector +- Logger (may also be a Multiton if there are many log files for + several purposes) +- Lock file for the application (there is only one in the filesystem + ...) + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Singleton UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Singleton.php + +.. literalinclude:: Singleton.php + :language: php + :linenos: + +Test +---- + +Tests/SingletonTest.php + +.. literalinclude:: Tests/SingletonTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Singleton diff --git a/Creational/StaticFactory/index.rst b/Creational/StaticFactory/index.rst new file mode 100644 index 0000000..85cacf7 --- /dev/null +++ b/Creational/StaticFactory/index.rst @@ -0,0 +1,64 @@ +Static Factory +============== + +Purpose +------- + +Similar to the AbstractFactory, this pattern is used to create series of +related or dependent objects. The difference between this and the +abstract factory pattern is that the static factory pattern uses just +one static method to create all types of objects it can create. It is +usually named ``factory`` or ``build``. + +Examples +-------- + +- Zend Framework: ``Zend_Cache_Backend`` or ``_Frontend`` use a factory + method create cache backends or frontends + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt StaticFactory UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +StaticFactory.php + +.. literalinclude:: StaticFactory.php + :language: php + :linenos: + +FormatterInterface.php + +.. literalinclude:: FormatterInterface.php + :language: php + :linenos: + +FormatString.php + +.. literalinclude:: FormatString.php + :language: php + :linenos: + +FormatNumber.php + +.. literalinclude:: FormatNumber.php + :language: php + :linenos: + +Test +---- + +Tests/StaticFactoryTest.php + +.. literalinclude:: Tests/StaticFactoryTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/StaticFactory diff --git a/Creational/index.rst b/Creational/index.rst new file mode 100644 index 0000000..1e34638 --- /dev/null +++ b/Creational/index.rst @@ -0,0 +1,36 @@ +Creational +========== + +In software engineering, creational design patterns are design patterns +that deal with object creation mechanisms, trying to create objects in a +manner suitable to the situation. The basic form of object creation +could result in design problems or added complexity to the design. +Creational design patterns solve this problem by somehow controlling +this object creation. + +- `AbstractFactory `__ + `:notebook: `__ +- `Builder `__ + `:notebook: `__ +- `FactoryMethod `__ + `:notebook: `__ +- `Multiton `__ (is considered an anti-pattern! :no\_entry:) +- `Pool `__ + `:notebook: `__ +- `Prototype `__ + `:notebook: `__ +- `SimpleFactory `__ +- `Singleton `__ + `:notebook: `__ (is + considered an anti-pattern! :no\_entry:) +- `StaticFactory `__ + +Code +---- + +You can also find these code on `GitHub`_ + +Test +---- + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational diff --git a/More/Delegation/index.rst b/More/Delegation/index.rst new file mode 100644 index 0000000..873f3e2 --- /dev/null +++ b/More/Delegation/index.rst @@ -0,0 +1,53 @@ +Delegation +========== + +Purpose +------- + +... + +Examples +-------- + +... + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Delegation UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Usage.php + +.. literalinclude:: Usage.php + :language: php + :linenos: + +TeamLead.php + +.. literalinclude:: TeamLead.php + :language: php + :linenos: + +JuniorDeveloper.php + +.. literalinclude:: JuniorDeveloper.php + :language: php + :linenos: + +Test +---- + +Tests/DelegationTest.php + +.. literalinclude:: Tests/DelegationTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/More/Delegation diff --git a/More/Repository/index.rst b/More/Repository/index.rst new file mode 100644 index 0000000..504be8b --- /dev/null +++ b/More/Repository/index.rst @@ -0,0 +1,61 @@ +Repository +========== + +Purpose +------- + +Mediates between the domain and data mapping layers using a +collection-like interface for accessing domain objects. Repository +encapsulates the set of objects persisted in a data store and the +operations performed over them, providing a more object-oriented view of +the persistence layer. Repository also supports the objective of +achieving a clean separation and one-way dependency between the domain +and data mapping layers. + +Examples +-------- + +- Doctrine 2 ORM: there is Repository that mediates between Entity and + DBAL and contains methods to retrieve objects +- Laravel Framework + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Repository UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +PostRepository.php + +.. literalinclude:: PostRepository.php + :language: php + :linenos: + +Post.php + +.. literalinclude:: Post.php + :language: php + :linenos: + +MemoryStorage.php + +.. literalinclude:: MemoryStorage.php + :language: php + :linenos: + +Storage.php + +.. literalinclude:: Storage.php + :language: php + :linenos: + +Test +---- + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/More/Repository diff --git a/More/ServiceLocator/index.rst b/More/ServiceLocator/index.rst new file mode 100644 index 0000000..96bad04 --- /dev/null +++ b/More/ServiceLocator/index.rst @@ -0,0 +1,83 @@ +Service Locator +=============== + +Purpose +------- + +To implement a loosely coupled architecture in order to get better +testable, maintainable and extendable code. DI pattern and Service +Locator pattern are an implementation of the Inverse of Control pattern. + +Usage +----- + +With ``ServiceLocator`` you can register a service for a given +interface. By using the interface you can retrieve the service and use +it in the classes of the application without knowing its implementation. +You can configure and inject the Service Locator object on bootstrap. + +Examples +-------- + +- Zend Framework 2 uses Service Locator to create and share services + used in the framework(i.e. EventManager, ModuleManager, all custom + user services provided by modules, etc...) + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt ServiceLocator UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +LogService.php + +.. literalinclude:: LogService.php + :language: php + :linenos: + +LogServiceInterface.php + +.. literalinclude:: LogServiceInterface.php + :language: php + :linenos: + +DatabaseServiceInterface.php + +.. literalinclude:: DatabaseServiceInterface.php + :language: php + :linenos: + +ServiceLocatorInterface.php + +.. literalinclude:: ServiceLocatorInterface.php + :language: php + :linenos: + +ServiceLocator.php + +.. literalinclude:: ServiceLocator.php + :language: php + :linenos: + +DatabaseService.php + +.. literalinclude:: DatabaseService.php + :language: php + :linenos: + +Test +---- + +Tests/ServiceLocatorTest.php + +.. literalinclude:: Tests/ServiceLocatorTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/More/ServiceLocator diff --git a/More/index.rst b/More/index.rst new file mode 100644 index 0000000..fd0cfb9 --- /dev/null +++ b/More/index.rst @@ -0,0 +1,18 @@ +More +==== + +- `Delegation `__ + `:notebook: `__ +- `ServiceLocator `__ + `:notebook: `__ +- `Repository `__ + +Code +---- + +You can also find these code on `GitHub`_ + +Test +---- + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/More diff --git a/Structural/Adapter/index.rst b/Structural/Adapter/index.rst new file mode 100644 index 0000000..5d843dd --- /dev/null +++ b/Structural/Adapter/index.rst @@ -0,0 +1,70 @@ +Adapter / Wrapper +================= + +Purpose +------- + +To translate one interface for a class into a compatible interface. An +adapter allows classes to work together that normally could not because +of incompatible interfaces by providing it's interface to clients while +using the original interface. + +Examples +-------- + +- DB Client libraries adapter +- using multiple different webservices and adapters normalize data so + that the outcome is the same for all + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Adapter UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +PaperBookInterface.php + +.. literalinclude:: PaperBookInterface.php + :language: php + :linenos: + +EBookInterface.php + +.. literalinclude:: EBookInterface.php + :language: php + :linenos: + +EBookAdapter.php + +.. literalinclude:: EBookAdapter.php + :language: php + :linenos: + +Kindle.php + +.. literalinclude:: Kindle.php + :language: php + :linenos: + +Book.php + +.. literalinclude:: Book.php + :language: php + :linenos: + +Test +---- + +Tests/AdapterTest.php + +.. literalinclude:: Tests/AdapterTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Adapter diff --git a/Structural/Bridge/index.rst b/Structural/Bridge/index.rst new file mode 100644 index 0000000..e83c84c --- /dev/null +++ b/Structural/Bridge/index.rst @@ -0,0 +1,70 @@ +Purpose +------- + +Decouple an abstraction from its implementation so that the two can vary +independently. (http://en.wikipedia.org/wiki/Bridge\_pattern) + +Sample: +^^^^^^^ + +- `Symfony + DoctrineBridge `__ + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Bridge UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Assemble.php + +.. literalinclude:: Assemble.php + :language: php + :linenos: + +Workshop.php + +.. literalinclude:: Workshop.php + :language: php + :linenos: + +Car.php + +.. literalinclude:: Car.php + :language: php + :linenos: + +Motorcycle.php + +.. literalinclude:: Motorcycle.php + :language: php + :linenos: + +Vehicle.php + +.. literalinclude:: Vehicle.php + :language: php + :linenos: + +Produce.php + +.. literalinclude:: Produce.php + :language: php + :linenos: + +Test +---- + +Tests/BridgeTest.php + +.. literalinclude:: Tests/BridgeTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Bridge diff --git a/Structural/Composite/index.rst b/Structural/Composite/index.rst new file mode 100644 index 0000000..ad59cc2 --- /dev/null +++ b/Structural/Composite/index.rst @@ -0,0 +1,64 @@ +Composite +========= + +Purpose +======= + +To treat a group of objects the same way as a single instance of the +object. + +Examples +======== + +- a form class instance handles all its form elements like a single + instance of the form, when ``render()`` is called, it subsequently + runs through all its child elements and calls ``render()`` on them +- ``Zend_Config``: a tree of configuration options, each one is a + ``Zend_Config`` object itself + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Composite UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +FormElement.php + +.. literalinclude:: FormElement.php + :language: php + :linenos: + +Form.php + +.. literalinclude:: Form.php + :language: php + :linenos: + +InputElement.php + +.. literalinclude:: InputElement.php + :language: php + :linenos: + +TextElement.php + +.. literalinclude:: TextElement.php + :language: php + :linenos: + +Test +---- + +Tests/CompositeTest.php + +.. literalinclude:: Tests/CompositeTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Composite diff --git a/Structural/DataMapper/index.rst b/Structural/DataMapper/index.rst new file mode 100644 index 0000000..cd51e7a --- /dev/null +++ b/Structural/DataMapper/index.rst @@ -0,0 +1,59 @@ +Data Mapper +=========== + +Purpose +------- + +A Data Mapper, is a Data Access Layer that performs bidirectional +transfer of data between a persistent data store (often a relational +database) and an in memory data representation (the domain layer). The +goal of the pattern is to keep the in memory representation and the +persistent data store independent of each other and the data mapper +itself. The layer is composed of one or more mappers (or Data Access +Objects), performing the data transfer. Mapper implementations vary in +scope. Generic mappers will handle many different domain entity types, +dedicated mappers will handle one or a few. + +The key point of this pattern is, unlike Active Record pattern, the data +model follows Single Responsibility Principle. + +Examples +-------- + +- DB Object Relational Mapper (ORM) : Doctrine2 uses DAO named as + "EntityRepository" + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt DataMapper UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +UserMapper.php + +.. literalinclude:: UserMapper.php + :language: php + :linenos: + +User.php + +.. literalinclude:: User.php + :language: php + :linenos: + +Test +---- + +Tests/DataMapperTest.php + +.. literalinclude:: Tests/DataMapperTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/DataMapper diff --git a/Structural/Decorator/index.rst b/Structural/Decorator/index.rst new file mode 100644 index 0000000..6ace194 --- /dev/null +++ b/Structural/Decorator/index.rst @@ -0,0 +1,67 @@ +Decorator +========= + +Purpose +------- + +To dynamically add new functionality to class instances. + +Examples +-------- + +- Zend Framework: decorators for ``Zend_Form_Element`` instances +- Web Service Layer: Decorators JSON and XML for a REST service (in + this case, only one of these should be allowed of course) + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Decorator UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +RendererInterface.php + +.. literalinclude:: RendererInterface.php + :language: php + :linenos: + +RenderInXml.php + +.. literalinclude:: RenderInXml.php + :language: php + :linenos: + +Webservice.php + +.. literalinclude:: Webservice.php + :language: php + :linenos: + +RenderInJson.php + +.. literalinclude:: RenderInJson.php + :language: php + :linenos: + +Decorator.php + +.. literalinclude:: Decorator.php + :language: php + :linenos: + +Test +---- + +Tests/DecoratorTest.php + +.. literalinclude:: Tests/DecoratorTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Decorator diff --git a/Structural/DependencyInjection/index.rst b/Structural/DependencyInjection/index.rst new file mode 100644 index 0000000..544cc64 --- /dev/null +++ b/Structural/DependencyInjection/index.rst @@ -0,0 +1,87 @@ +Dependency Injection +==================== + +Purpose +------- + +To implement a loosely coupled architecture in order to get better +testable, maintainable and extendable code. + +Usage +----- + +Configuration gets injected and ``Connection`` will get all that it +needs from ``$config``. Without DI, the configuration would be created +directly in ``Connection``, which is not very good for testing and +extending ``Connection``. + +Notice we are following Inversion of control principle in ``Connection`` +by asking ``$config`` to implement ``Parameters`` interface. This +decouples our components. We don't care where the source of information +comes from, we only care that ``$config`` has certain methods to +retrieve that information. Read more about Inversion of control +`here `__. + +Examples +-------- + +- The Doctrine2 ORM uses dependency injection e.g. for configuration + that is injected into a ``Connection`` object. For testing purposes, + one can easily create a mock object of the configuration and inject + that into the ``Connection`` object +- Symfony and Zend Framework 2 already have containers for DI that + create objects via a configuration array and inject them where needed + (i.e. in Controllers) + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt DependencyInjection UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Connection.php + +.. literalinclude:: Connection.php + :language: php + :linenos: + +ArrayConfig.php + +.. literalinclude:: ArrayConfig.php + :language: php + :linenos: + +AbstractConfig.php + +.. literalinclude:: AbstractConfig.php + :language: php + :linenos: + +Parameters.php + +.. literalinclude:: Parameters.php + :language: php + :linenos: + +Test +---- + +Tests/DependencyInjectionTest.php + +.. literalinclude:: Tests/DependencyInjectionTest.php + :language: php + :linenos: + +Tests/config.php + +.. literalinclude:: Tests/config.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/DependencyInjection diff --git a/Structural/Facade/index.rst b/Structural/Facade/index.rst new file mode 100644 index 0000000..6df49cc --- /dev/null +++ b/Structural/Facade/index.rst @@ -0,0 +1,65 @@ +Facade +====== + +Purpose +------- + +The primary goal of a Facade Pattern is not to avoid you to read the +manual of a complex API. It's only a side-effect. The first goal is to +reduce coupling and follow the Law of Demeter. + +A Facade is meant to decouple a client and a sub-system by embedding +many (but sometimes just one) interface, and of course to reduce +complexity. + +- A facade does not forbid you the access to the sub-system +- You can (you should) have multiple facades for one sub-system + +That's why a good facade has no ``new`` in it. If there are multiple +creations for each method, it is not a Facade, it's a Builder or a +[Abstract\|Static\|Simple] Factory [Method]. + +The best facade has no ``new`` and a constructor with +interface-type-hinted parameters. If you need creation of new instances, +use a Factory as argument. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Facade UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +OsInterface.php + +.. literalinclude:: OsInterface.php + :language: php + :linenos: + +Facade.php + +.. literalinclude:: Facade.php + :language: php + :linenos: + +BiosInterface.php + +.. literalinclude:: BiosInterface.php + :language: php + :linenos: + +Test +---- + +Tests/FacadeTest.php + +.. literalinclude:: Tests/FacadeTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Facade diff --git a/Structural/FluentInterface/index.rst b/Structural/FluentInterface/index.rst new file mode 100644 index 0000000..80adfbe --- /dev/null +++ b/Structural/FluentInterface/index.rst @@ -0,0 +1,45 @@ +Fluent Interface +================ + +Purpose +------- + +To write code that is easy readable just like sentences in a natural +language (like English). + +Examples +-------- + +- Doctrine2's QueryBuilder works something like that example class + below +- PHPUnit uses fluent interfaces to build mock objects +- Yii Framework: CDbCommand and CActiveRecord use this pattern, too + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt FluentInterface UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Sql.php + +.. literalinclude:: Sql.php + :language: php + :linenos: + +Test +---- + +Tests/FluentInterfaceTest.php + +.. literalinclude:: Tests/FluentInterfaceTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/FluentInterface diff --git a/Structural/Proxy/index.rst b/Structural/Proxy/index.rst new file mode 100644 index 0000000..a7ce379 --- /dev/null +++ b/Structural/Proxy/index.rst @@ -0,0 +1,43 @@ +Proxy +===== + +Purpose +------- + +To interface to anything that is expensive or impossible to duplicate. + +Examples +-------- + +- Doctrine2 uses proxies to implement framework magic (e.g. lazy + initialization) in them, while the user still works with his own + entity classes and will never use nor touch the proxies + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Proxy UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +RecordProxy.php + +.. literalinclude:: RecordProxy.php + :language: php + :linenos: + +Record.php + +.. literalinclude:: Record.php + :language: php + :linenos: + +Test +---- + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Proxy diff --git a/Structural/Registry/index.rst b/Structural/Registry/index.rst new file mode 100644 index 0000000..b63e1c6 --- /dev/null +++ b/Structural/Registry/index.rst @@ -0,0 +1,46 @@ +Registry +======== + +Purpose +------- + +To implement a central storage for objects often used throughout the +application, is typically implemented using an abstract class with only +static methods (or using the Singleton pattern) + +Examples +-------- + +- Zend Framework: ``Zend_Registry`` holds the application's logger + object, front controller etc. +- Yii Framework: ``CWebApplication`` holds all the application + components, such as ``CWebUser``, ``CUrlManager``, etc. + +UML Diagram +----------- + +.. image:: uml/uml.png + :alt: Alt Registry UML Diagram + :align: center + +Code +---- + +You can also find these code on `GitHub`_ + +Registry.php + +.. literalinclude:: Registry.php + :language: php + :linenos: + +Test +---- + +Tests/RegistryTest.php + +.. literalinclude:: Tests/RegistryTest.php + :language: php + :linenos: + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Registry diff --git a/Structural/index.rst b/Structural/index.rst new file mode 100644 index 0000000..49867ee --- /dev/null +++ b/Structural/index.rst @@ -0,0 +1,37 @@ +Structural +========== + +In Software Engineering, Structural Design Patterns are Design Patterns +that ease the design by identifying a simple way to realize +relationships between entities. + +- `Adapter `__ + `:notebook: `__ +- `Bridge `__ + `:notebook: `__ +- `Composite `__ + `:notebook: `__ +- `DataMapper `__ + `:notebook: `__ +- `Decorator `__ + `:notebook: `__ +- `DependencyInjection `__ + `:notebook: `__ +- `Facade `__ + `:notebook: `__ +- `FluentInterface `__ + `:notebook: `__ +- `Proxy `__ + `:notebook: `__ +- `Registry `__ + `:notebook: `__ + +Code +---- + +You can also find these code on `GitHub`_ + +Test +---- + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural diff --git a/index.rst b/index.rst new file mode 100644 index 0000000..d6bb000 --- /dev/null +++ b/index.rst @@ -0,0 +1,153 @@ +DesignPatternsPHP +================= + +|Build Status| + +This is a collection of known design patterns and some sample code how +to implement them in PHP. Every pattern has a small list of examples +(most of them from Zend Framework, Symfony2 or Doctrine2 as I'm most +familiar with this software). + +I think the problem with patterns is that often people do know them but +don't know when to apply which. + +Patterns +-------- + +The patterns can be structured in roughly three different categories. +Please click on the +`:notebook: `__ +for a full explanation of the pattern on Wikipedia. + +`Creational `__ +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- `AbstractFactory `__ + `:notebook: `__ +- `Builder `__ + `:notebook: `__ +- `FactoryMethod `__ + `:notebook: `__ +- `Multiton `__ (is considered an anti-pattern! + :no\_entry:) +- `Pool `__ + `:notebook: `__ +- `Prototype `__ + `:notebook: `__ +- `SimpleFactory `__ +- `Singleton `__ + `:notebook: `__ (is + considered an anti-pattern! :no\_entry:) +- `StaticFactory `__ + +`Structural `__ +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- `Adapter `__ + `:notebook: `__ +- `Bridge `__ + `:notebook: `__ +- `Composite `__ + `:notebook: `__ +- `DataMapper `__ + `:notebook: `__ +- `Decorator `__ + `:notebook: `__ +- `DependencyInjection `__ + `:notebook: `__ +- `Facade `__ + `:notebook: `__ +- `FluentInterface `__ + `:notebook: `__ +- `Proxy `__ + `:notebook: `__ +- `Registry `__ + `:notebook: `__ + +`Behavioral `__ +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- `ChainOfResponsibilities `__ + `:notebook: `__ +- `Command `__ + `:notebook: `__ +- `Iterator `__ + `:notebook: `__ +- `Mediator `__ + `:notebook: `__ +- `Memento `__ + `:notebook: `__ +- `NullObject `__ + `:notebook: `__ +- `Observer `__ + `:notebook: `__ +- `Specification `__ + `:notebook: `__ +- `State `__ + `:notebook: `__ +- `Strategy `__ + `:notebook: `__ +- `TemplateMethod `__ + `:notebook: `__ +- `Visitor `__ + `:notebook: `__ + +`More `__ +~~~~~~~~~~~~~~~ + +- `Delegation `__ + `:notebook: `__ +- `ServiceLocator `__ + `:notebook: `__ +- `Repository `__ + +Contribute +---------- + +Please feel free to fork and extend existing or add your own examples +and send a pull request with your changes! To establish a consistent +code quality, please check your code using +`PHP\_CodeSniffer `__ +against `PSR2 +standard `__ +using ``./vendor/bin/phpcs -p --standard=PSR2 --ignore=vendor .``. + +License +------- + +(The MIT License) + +Copyright (c) 2014 Dominik Liebler and +`contributors `__ + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +.. |Build Status| image:: https://travis-ci.org/domnikl/DesignPatternsPHP.png?branch=master + :target: https://travis-ci.org/domnikl/DesignPatternsPHP + +Code +---- + +You can also find these code on `GitHub`_ + +Test +---- + +.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/ From 1f38f34fc9e33fdbadc50d254ec7f949cdd135d9 Mon Sep 17 00:00:00 2001 From: Faust Date: Thu, 2 Apr 2015 00:06:29 +0200 Subject: [PATCH 03/14] sphinx-quickstart --- Makefile | 192 ++++++++++++++++++++++++++++++++++++ conf.py | 284 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ index.rst | 2 + make.bat | 263 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 741 insertions(+) create mode 100644 Makefile create mode 100644 conf.py create mode 100644 make.bat diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..52169e6 --- /dev/null +++ b/Makefile @@ -0,0 +1,192 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/DesignPatternsPHP.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/DesignPatternsPHP.qhc" + +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/DesignPatternsPHP" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/DesignPatternsPHP" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/conf.py b/conf.py new file mode 100644 index 0000000..5354e1f --- /dev/null +++ b/conf.py @@ -0,0 +1,284 @@ +# -*- coding: utf-8 -*- +# +# DesignPatternsPHP documentation build configuration file, created by +# sphinx-quickstart on Thu Apr 2 00:05:03 2015. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os +import shlex + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'DesignPatternsPHP' +copyright = u'2015, Dominik Liebler' +author = u'Dominik Liebler' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '1.0' +# The full version, including alpha/beta/rc tags. +release = '1.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'sphinx-rtd-theme' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' +#html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +#html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +#html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'DesignPatternsPHPdoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', + +# Latex figure (float) alignment +#'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'DesignPatternsPHP.tex', u'DesignPatternsPHP Documentation', + u'Dominik Liebler', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'designpatternsphp', u'DesignPatternsPHP Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'DesignPatternsPHP', u'DesignPatternsPHP Documentation', + author, 'DesignPatternsPHP', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False diff --git a/index.rst b/index.rst index d6bb000..b7f75a2 100644 --- a/index.rst +++ b/index.rst @@ -1,3 +1,5 @@ +.. DesignPatternsPHP + DesignPatternsPHP ================= diff --git a/make.bat b/make.bat new file mode 100644 index 0000000..fecc894 --- /dev/null +++ b/make.bat @@ -0,0 +1,263 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + echo. coverage to run coverage check of the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +REM Check if sphinx-build is available and fallback to Python version if any +%SPHINXBUILD% 2> nul +if errorlevel 9009 goto sphinx_python +goto sphinx_ok + +:sphinx_python + +set SPHINXBUILD=python -m sphinx.__init__ +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +:sphinx_ok + + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\DesignPatternsPHP.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\DesignPatternsPHP.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "coverage" ( + %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage + if errorlevel 1 exit /b 1 + echo. + echo.Testing of coverage in the sources finished, look at the ^ +results in %BUILDDIR%/coverage/python.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +:end From 9d91da41539c2569e9ed3d170a20d6e15008b43d Mon Sep 17 00:00:00 2001 From: Faust Date: Thu, 2 Apr 2015 00:16:16 +0200 Subject: [PATCH 04/14] create TocTree index --- .gitignore | 1 + Behavioral/index.rst | 45 ++++++------------ Creational/Multiton/index.rst | 4 +- Creational/index.rst | 36 +++++--------- More/index.rst | 19 ++------ Structural/Bridge/index.rst | 3 ++ Structural/Composite/index.rst | 4 +- Structural/index.rst | 41 +++++----------- conf.py | 2 +- index.rst | 87 +++------------------------------- 10 files changed, 58 insertions(+), 184 deletions(-) diff --git a/.gitignore b/.gitignore index 601f317..1466a8e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .idea /nbproject /vendor/ +_build/ diff --git a/Behavioral/index.rst b/Behavioral/index.rst index 5691a0d..3513745 100644 --- a/Behavioral/index.rst +++ b/Behavioral/index.rst @@ -6,35 +6,18 @@ that identify common communication patterns between objects and realize these patterns. By doing so, these patterns increase flexibility in carrying out this communication. -- `ChainOfResponsibilities `__ - `:notebook: `__ -- `Command `__ - `:notebook: `__ -- `Iterator `__ - `:notebook: `__ -- `Mediator `__ - `:notebook: `__ -- `NullObject `__ - `:notebook: `__ -- `Observer `__ - `:notebook: `__ -- `Specification `__ - `:notebook: `__ -- `State `__ - `:notebook: `__ -- `Strategy `__ - `:notebook: `__ -- `TemplateMethod `__ - `:notebook: `__ -- `Visitor `__ - `:notebook: `__ +.. toctree:: + :titlesonly: -Code ----- - -You can also find these code on `GitHub`_ - -Test ----- - -.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral + ChainOfResponsibilities/index + Command/index + Iterator/index + Mediator/index + Memento/index + NullObject/index + Observer/index + Specification/index + State/index + Strategy/index + TemplateMethod/index + Visitor/index \ No newline at end of file diff --git a/Creational/Multiton/index.rst b/Creational/Multiton/index.rst index 66b8764..3f5167e 100644 --- a/Creational/Multiton/index.rst +++ b/Creational/Multiton/index.rst @@ -5,13 +5,13 @@ Multiton MAINTAINABILITY USE DEPENDENCY INJECTION!** Purpose -======= +------- To have only a list of named instances that are used, like a singleton but with n instances. Examples -======== +-------- - 2 DB Connectors, e.g. one for MySQL, the other for SQLite - multiple Loggers (one for debug messages, one for errors) diff --git a/Creational/index.rst b/Creational/index.rst index 1e34638..6d041a7 100644 --- a/Creational/index.rst +++ b/Creational/index.rst @@ -8,29 +8,15 @@ could result in design problems or added complexity to the design. Creational design patterns solve this problem by somehow controlling this object creation. -- `AbstractFactory `__ - `:notebook: `__ -- `Builder `__ - `:notebook: `__ -- `FactoryMethod `__ - `:notebook: `__ -- `Multiton `__ (is considered an anti-pattern! :no\_entry:) -- `Pool `__ - `:notebook: `__ -- `Prototype `__ - `:notebook: `__ -- `SimpleFactory `__ -- `Singleton `__ - `:notebook: `__ (is - considered an anti-pattern! :no\_entry:) -- `StaticFactory `__ +.. toctree:: + :titlesonly: -Code ----- - -You can also find these code on `GitHub`_ - -Test ----- - -.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational + AbstractFactory/index + Builder/index + FactoryMethod/index + Multiton/index + Pool/index + Prototype/index + SimpleFactory/index + Singleton/index + StaticFactory/index \ No newline at end of file diff --git a/More/index.rst b/More/index.rst index fd0cfb9..6ba85d3 100644 --- a/More/index.rst +++ b/More/index.rst @@ -1,18 +1,9 @@ More ==== -- `Delegation `__ - `:notebook: `__ -- `ServiceLocator `__ - `:notebook: `__ -- `Repository `__ +.. toctree:: + :titlesonly: -Code ----- - -You can also find these code on `GitHub`_ - -Test ----- - -.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/More + Delegation/index + ServiceLocator/index + Repository/index \ No newline at end of file diff --git a/Structural/Bridge/index.rst b/Structural/Bridge/index.rst index e83c84c..5fb8cfe 100644 --- a/Structural/Bridge/index.rst +++ b/Structural/Bridge/index.rst @@ -1,3 +1,6 @@ +Bridge +====== + Purpose ------- diff --git a/Structural/Composite/index.rst b/Structural/Composite/index.rst index ad59cc2..ff91f66 100644 --- a/Structural/Composite/index.rst +++ b/Structural/Composite/index.rst @@ -2,13 +2,13 @@ Composite ========= Purpose -======= +------- To treat a group of objects the same way as a single instance of the object. Examples -======== +-------- - a form class instance handles all its form elements like a single instance of the form, when ``render()`` is called, it subsequently diff --git a/Structural/index.rst b/Structural/index.rst index 49867ee..6505413 100644 --- a/Structural/index.rst +++ b/Structural/index.rst @@ -5,33 +5,16 @@ In Software Engineering, Structural Design Patterns are Design Patterns that ease the design by identifying a simple way to realize relationships between entities. -- `Adapter `__ - `:notebook: `__ -- `Bridge `__ - `:notebook: `__ -- `Composite `__ - `:notebook: `__ -- `DataMapper `__ - `:notebook: `__ -- `Decorator `__ - `:notebook: `__ -- `DependencyInjection `__ - `:notebook: `__ -- `Facade `__ - `:notebook: `__ -- `FluentInterface `__ - `:notebook: `__ -- `Proxy `__ - `:notebook: `__ -- `Registry `__ - `:notebook: `__ +.. toctree:: + :titlesonly: -Code ----- - -You can also find these code on `GitHub`_ - -Test ----- - -.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural + Adapter/index + Bridge/index + Composite/index + DataMapper/index + Decorator/index + DependencyInjection/index + Facade/index + FluentInterface/index + Proxy/index + Registry/index \ No newline at end of file diff --git a/conf.py b/conf.py index 5354e1f..c58ec9d 100644 --- a/conf.py +++ b/conf.py @@ -108,7 +108,7 @@ todo_include_todos = False # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'sphinx-rtd-theme' +html_theme = 'sphinx_rtd_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the diff --git a/index.rst b/index.rst index b7f75a2..7911c10 100644 --- a/index.rst +++ b/index.rst @@ -21,87 +21,14 @@ Please click on the `:notebook: `__ for a full explanation of the pattern on Wikipedia. -`Creational `__ -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. toctree:: + :titlesonly: + :numbered: -- `AbstractFactory `__ - `:notebook: `__ -- `Builder `__ - `:notebook: `__ -- `FactoryMethod `__ - `:notebook: `__ -- `Multiton `__ (is considered an anti-pattern! - :no\_entry:) -- `Pool `__ - `:notebook: `__ -- `Prototype `__ - `:notebook: `__ -- `SimpleFactory `__ -- `Singleton `__ - `:notebook: `__ (is - considered an anti-pattern! :no\_entry:) -- `StaticFactory `__ - -`Structural `__ -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- `Adapter `__ - `:notebook: `__ -- `Bridge `__ - `:notebook: `__ -- `Composite `__ - `:notebook: `__ -- `DataMapper `__ - `:notebook: `__ -- `Decorator `__ - `:notebook: `__ -- `DependencyInjection `__ - `:notebook: `__ -- `Facade `__ - `:notebook: `__ -- `FluentInterface `__ - `:notebook: `__ -- `Proxy `__ - `:notebook: `__ -- `Registry `__ - `:notebook: `__ - -`Behavioral `__ -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- `ChainOfResponsibilities `__ - `:notebook: `__ -- `Command `__ - `:notebook: `__ -- `Iterator `__ - `:notebook: `__ -- `Mediator `__ - `:notebook: `__ -- `Memento `__ - `:notebook: `__ -- `NullObject `__ - `:notebook: `__ -- `Observer `__ - `:notebook: `__ -- `Specification `__ - `:notebook: `__ -- `State `__ - `:notebook: `__ -- `Strategy `__ - `:notebook: `__ -- `TemplateMethod `__ - `:notebook: `__ -- `Visitor `__ - `:notebook: `__ - -`More `__ -~~~~~~~~~~~~~~~ - -- `Delegation `__ - `:notebook: `__ -- `ServiceLocator `__ - `:notebook: `__ -- `Repository `__ + Creational/index + Structural/index + Behavioral/index + More/index Contribute ---------- From 795996e99351f14aef3956b46c6318862531e807 Mon Sep 17 00:00:00 2001 From: Faust Date: Thu, 2 Apr 2015 00:33:44 +0200 Subject: [PATCH 05/14] fix index --- index.rst | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/index.rst b/index.rst index 7911c10..bd254ec 100644 --- a/index.rst +++ b/index.rst @@ -3,7 +3,9 @@ DesignPatternsPHP ================= -|Build Status| +.. image:: https://readthedocs.org/projects/designpatterns-php/badge/?version=read-the-docs + :target: https://readthedocs.org/projects/designpatterns-php/?badge=read-the-docs + :alt: Documentation Status This is a collection of known design patterns and some sample code how to implement them in PHP. Every pattern has a small list of examples @@ -18,7 +20,7 @@ Patterns The patterns can be structured in roughly three different categories. Please click on the -`:notebook: `__ +`here `__ for a full explanation of the pattern on Wikipedia. .. toctree:: @@ -67,16 +69,3 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -.. |Build Status| image:: https://travis-ci.org/domnikl/DesignPatternsPHP.png?branch=master - :target: https://travis-ci.org/domnikl/DesignPatternsPHP - -Code ----- - -You can also find these code on `GitHub`_ - -Test ----- - -.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/ From 6579a466a8e32526a21282afef8efe7aca5af1ce Mon Sep 17 00:00:00 2001 From: Faust Date: Thu, 2 Apr 2015 00:48:24 +0200 Subject: [PATCH 06/14] update badge doc --- index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.rst b/index.rst index bd254ec..e3a755a 100644 --- a/index.rst +++ b/index.rst @@ -3,8 +3,8 @@ DesignPatternsPHP ================= -.. image:: https://readthedocs.org/projects/designpatterns-php/badge/?version=read-the-docs - :target: https://readthedocs.org/projects/designpatterns-php/?badge=read-the-docs +.. image:: https://readthedocs.org/projects/designpatterns-php/badge/?version=latest + :target: https://readthedocs.org/projects/designpatterns-php/?badge=latest :alt: Documentation Status This is a collection of known design patterns and some sample code how From eb65f82ef4972a8654a5c599066c03453fbffd9a Mon Sep 17 00:00:00 2001 From: Faust Date: Thu, 2 Apr 2015 00:57:18 +0200 Subject: [PATCH 07/14] add link to README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b35d4dd..a64312f 100755 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ [![Build Status](https://travis-ci.org/domnikl/DesignPatternsPHP.png?branch=master)](https://travis-ci.org/domnikl/DesignPatternsPHP) +[Read the Docs of DesignPatternsPHP](http://designpatterns-php.readthedocs.org) + This is a collection of known design patterns and some sample code how to implement them in PHP. Every pattern has a small list of examples (most of them from Zend Framework, Symfony2 or Doctrine2 as I'm most familiar with this software). I think the problem with patterns is that often people do know them but don't know when to apply which. From 9fd800b9f6e76752ca79a6b3182ebf8a143661c1 Mon Sep 17 00:00:00 2001 From: Faust Date: Fri, 3 Apr 2015 00:24:24 +0200 Subject: [PATCH 08/14] fix embed some files and add download link to README.md --- Behavioral/ChainOfResponsibilities/index.rst | 12 +++++ Behavioral/Mediator/index.rst | 18 +++++++ Creational/AbstractFactory/index.rst | 24 +++++++++ Creational/Builder/Parts/index.rst | 53 -------------------- Creational/Builder/index.rst | 36 +++++++++++++ README.md | 1 + conf.py | 2 +- index.rst | 2 +- 8 files changed, 93 insertions(+), 55 deletions(-) delete mode 100644 Creational/Builder/Parts/index.rst diff --git a/Behavioral/ChainOfResponsibilities/index.rst b/Behavioral/ChainOfResponsibilities/index.rst index c838a29..68883c7 100644 --- a/Behavioral/ChainOfResponsibilities/index.rst +++ b/Behavioral/ChainOfResponsibilities/index.rst @@ -45,6 +45,18 @@ Request.php :language: php :linenos: +Responsible/FastStorage.php + +.. literalinclude:: Responsible/FastStorage.php + :language: php + :linenos: + +Responsible/SlowStorage.php + +.. literalinclude:: Responsible/SlowStorage.php + :language: php + :linenos: + Test ---- diff --git a/Behavioral/Mediator/index.rst b/Behavioral/Mediator/index.rst index 7df0287..d922b44 100644 --- a/Behavioral/Mediator/index.rst +++ b/Behavioral/Mediator/index.rst @@ -42,6 +42,24 @@ Colleague.php :language: php :linenos: +Subsystem/Client.php + +.. literalinclude:: Subsystem/Client.php + :language: php + :linenos: + +Subsystem/Database.php + +.. literalinclude:: Subsystem/Database.php + :language: php + :linenos: + +Subsystem/Server.php + +.. literalinclude:: Subsystem/Server.php + :language: php + :linenos: + Test ---- diff --git a/Creational/AbstractFactory/index.rst b/Creational/AbstractFactory/index.rst index 707968c..e8d2000 100644 --- a/Creational/AbstractFactory/index.rst +++ b/Creational/AbstractFactory/index.rst @@ -57,6 +57,30 @@ Picture.php :language: php :linenos: +Html/Picture.php + +.. literalinclude:: Html/Picture.php + :language: php + :linenos: + +Html/Text.php + +.. literalinclude:: Html/Text.php + :language: php + :linenos: + +Json/Picture.php + +.. literalinclude:: Json/Picture.php + :language: php + :linenos: + +Json/Text.php + +.. literalinclude:: Json/Text.php + :language: php + :linenos: + Test ---- diff --git a/Creational/Builder/Parts/index.rst b/Creational/Builder/Parts/index.rst deleted file mode 100644 index 8760de0..0000000 --- a/Creational/Builder/Parts/index.rst +++ /dev/null @@ -1,53 +0,0 @@ -Purpose -======= - -Examples -======== - -- - -Code ----- - -You can also find these code on `GitHub`_ - -Wheel.php - -.. literalinclude:: Wheel.php - :language: php - :linenos: - -Door.php - -.. literalinclude:: Door.php - :language: php - :linenos: - -Car.php - -.. literalinclude:: Car.php - :language: php - :linenos: - -Bike.php - -.. literalinclude:: Bike.php - :language: php - :linenos: - -Vehicle.php - -.. literalinclude:: Vehicle.php - :language: php - :linenos: - -Engine.php - -.. literalinclude:: Engine.php - :language: php - :linenos: - -Test ----- - -.. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Builder/Parts diff --git a/Creational/Builder/index.rst b/Creational/Builder/index.rst index b636e01..77fc308 100644 --- a/Creational/Builder/index.rst +++ b/Creational/Builder/index.rst @@ -56,6 +56,42 @@ BikeBuilder.php :language: php :linenos: +Parts/Wheel.php + +.. literalinclude:: Parts/Wheel.php + :language: php + :linenos: + +Parts/Door.php + +.. literalinclude:: Parts/Door.php + :language: php + :linenos: + +Parts/Car.php + +.. literalinclude:: Parts/Car.php + :language: php + :linenos: + +Parts/Bike.php + +.. literalinclude:: Parts/Bike.php + :language: php + :linenos: + +Parts/Vehicle.php + +.. literalinclude:: Parts/Vehicle.php + :language: php + :linenos: + +Parts/Engine.php + +.. literalinclude:: Parts/Engine.php + :language: php + :linenos: + Test ---- diff --git a/README.md b/README.md index a64312f..05e3d11 100755 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Build Status](https://travis-ci.org/domnikl/DesignPatternsPHP.png?branch=master)](https://travis-ci.org/domnikl/DesignPatternsPHP) [Read the Docs of DesignPatternsPHP](http://designpatterns-php.readthedocs.org) +or [Download as PDF/Epub](https://readthedocs.org/projects/designpatterns-php/downloads/) This is a collection of known design patterns and some sample code how to implement them in PHP. Every pattern has a small list of examples (most of them from Zend Framework, Symfony2 or Doctrine2 as I'm most familiar with this software). diff --git a/conf.py b/conf.py index c58ec9d..a21fb82 100644 --- a/conf.py +++ b/conf.py @@ -48,7 +48,7 @@ master_doc = 'index' # General information about the project. project = u'DesignPatternsPHP' copyright = u'2015, Dominik Liebler' -author = u'Dominik Liebler' +author = u'Dominik Liebler with contributors' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the diff --git a/index.rst b/index.rst index e3a755a..c91e458 100644 --- a/index.rst +++ b/index.rst @@ -19,7 +19,7 @@ Patterns -------- The patterns can be structured in roughly three different categories. -Please click on the +Please click `here `__ for a full explanation of the pattern on Wikipedia. From c609ef5952d470b109ef4c9a02ed2452a4c7827c Mon Sep 17 00:00:00 2001 From: Faust Date: Fri, 3 Apr 2015 10:57:00 +0200 Subject: [PATCH 09/14] add wikipedia link --- Behavioral/ChainOfResponsibilities/index.rst | 8 ++++++-- Behavioral/Command/index.rst | 8 ++++++-- Behavioral/Iterator/index.rst | 8 ++++++-- Behavioral/Mediator/index.rst | 8 ++++++-- Behavioral/Memento/index.rst | 8 ++++++-- Behavioral/NullObject/index.rst | 8 ++++++-- Behavioral/Observer/index.rst | 8 ++++++-- Behavioral/README.md | 1 + Behavioral/Specification/index.rst | 8 ++++++-- Behavioral/State/index.rst | 8 ++++++-- Behavioral/Strategy/index.rst | 8 ++++++-- Behavioral/TemplateMethod/index.rst | 8 ++++++-- Behavioral/Visitor/index.rst | 8 ++++++-- Creational/AbstractFactory/index.rst | 8 ++++++-- Creational/Builder/index.rst | 8 ++++++-- Creational/FactoryMethod/index.rst | 8 ++++++-- Creational/Pool/index.rst | 8 ++++++-- Creational/Prototype/index.rst | 8 ++++++-- Creational/Singleton/index.rst | 8 ++++++-- More/Delegation/index.rst | 8 ++++++-- More/ServiceLocator/index.rst | 8 ++++++-- Structural/Adapter/index.rst | 8 ++++++-- Structural/Bridge/index.rst | 8 ++++++-- Structural/Composite/index.rst | 8 ++++++-- Structural/DataMapper/index.rst | 8 ++++++-- Structural/Decorator/index.rst | 8 ++++++-- Structural/DependencyInjection/index.rst | 8 ++++++-- Structural/Facade/index.rst | 8 ++++++-- Structural/FluentInterface/index.rst | 8 ++++++-- Structural/Proxy/index.rst | 8 ++++++-- Structural/Registry/index.rst | 8 ++++++-- _static/Wikipedia-logo.png | Bin 0 -> 43627 bytes conf.py | 2 +- index.rst | 9 ++++++--- 34 files changed, 188 insertions(+), 64 deletions(-) create mode 100644 _static/Wikipedia-logo.png diff --git a/Behavioral/ChainOfResponsibilities/index.rst b/Behavioral/ChainOfResponsibilities/index.rst index 68883c7..efeff83 100644 --- a/Behavioral/ChainOfResponsibilities/index.rst +++ b/Behavioral/ChainOfResponsibilities/index.rst @@ -1,5 +1,5 @@ -Chain Of Responsibilities -========================= +Chain Of Responsibilities |Wikipedia|_ +====================================== Purpose: -------- @@ -67,3 +67,7 @@ Tests/ChainTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/ChainOfResponsibilities +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Chain_of_responsibility_pattern \ No newline at end of file diff --git a/Behavioral/Command/index.rst b/Behavioral/Command/index.rst index 5056f13..f6d041e 100644 --- a/Behavioral/Command/index.rst +++ b/Behavioral/Command/index.rst @@ -1,5 +1,5 @@ -Command -======= +Command |Wikipedia|_ +==================== Purpose ------- @@ -74,3 +74,7 @@ Tests/CommandTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Command +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Command_pattern \ No newline at end of file diff --git a/Behavioral/Iterator/index.rst b/Behavioral/Iterator/index.rst index 6241bc8..3ef9e72 100644 --- a/Behavioral/Iterator/index.rst +++ b/Behavioral/Iterator/index.rst @@ -1,5 +1,5 @@ -Iterator -======== +Iterator |Wikipedia|_ +===================== Purpose ------- @@ -67,3 +67,7 @@ Tests/IteratorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Iterator +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Iterator_pattern \ No newline at end of file diff --git a/Behavioral/Mediator/index.rst b/Behavioral/Mediator/index.rst index d922b44..77c7aaf 100644 --- a/Behavioral/Mediator/index.rst +++ b/Behavioral/Mediator/index.rst @@ -1,5 +1,5 @@ -Mediator -======== +Mediator |Wikipedia|_ +===================== Purpose ------- @@ -70,3 +70,7 @@ Tests/MediatorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Mediator +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Mediator_pattern \ No newline at end of file diff --git a/Behavioral/Memento/index.rst b/Behavioral/Memento/index.rst index 9d28f27..d5ce670 100644 --- a/Behavioral/Memento/index.rst +++ b/Behavioral/Memento/index.rst @@ -1,5 +1,5 @@ -Memento -======= +Memento |Wikipedia|_ +==================== Purpose ------- @@ -65,3 +65,7 @@ Tests/MementoTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Memento +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Memento_pattern \ No newline at end of file diff --git a/Behavioral/NullObject/index.rst b/Behavioral/NullObject/index.rst index eb13a56..15d8eaf 100644 --- a/Behavioral/NullObject/index.rst +++ b/Behavioral/NullObject/index.rst @@ -1,5 +1,5 @@ -Null Object -=========== +Null Object |Wikipedia|_ +======================== Purpose ------- @@ -72,3 +72,7 @@ Tests/LoggerTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/NullObject +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Null_Object_pattern \ No newline at end of file diff --git a/Behavioral/Observer/index.rst b/Behavioral/Observer/index.rst index c14c448..4a9225f 100644 --- a/Behavioral/Observer/index.rst +++ b/Behavioral/Observer/index.rst @@ -1,5 +1,5 @@ -Observer -======== +Observer |Wikipedia|_ +===================== Purpose ------- @@ -55,3 +55,7 @@ Tests/ObserverTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Observer +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Observer_pattern \ No newline at end of file diff --git a/Behavioral/README.md b/Behavioral/README.md index d9c264e..bdf7316 100644 --- a/Behavioral/README.md +++ b/Behavioral/README.md @@ -9,6 +9,7 @@ communication. * [Command](Command) [:notebook:](http://en.wikipedia.org/wiki/Command_pattern) * [Iterator](Iterator) [:notebook:](http://en.wikipedia.org/wiki/Iterator_pattern) * [Mediator](Mediator) [:notebook:](http://en.wikipedia.org/wiki/Mediator_pattern) +* [Memento](Behavioral/Memento) [:notebook:](http://en.wikipedia.org/wiki/Memento_pattern) * [NullObject](NullObject) [:notebook:](http://en.wikipedia.org/wiki/Null_Object_pattern) * [Observer](Observer) [:notebook:](http://en.wikipedia.org/wiki/Observer_pattern) * [Specification](Specification) [:notebook:](http://en.wikipedia.org/wiki/Specification_pattern) diff --git a/Behavioral/Specification/index.rst b/Behavioral/Specification/index.rst index 6923159..167ce76 100644 --- a/Behavioral/Specification/index.rst +++ b/Behavioral/Specification/index.rst @@ -1,5 +1,5 @@ -Specification -============= +Specification |Wikipedia|_ +========================== Purpose ------- @@ -73,3 +73,7 @@ Tests/SpecificationTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Specification +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Specification_pattern \ No newline at end of file diff --git a/Behavioral/State/index.rst b/Behavioral/State/index.rst index 0b679c2..6815f38 100644 --- a/Behavioral/State/index.rst +++ b/Behavioral/State/index.rst @@ -1,5 +1,5 @@ -State -===== +State |Wikipedia|_ +================== Purpose ------- @@ -54,3 +54,7 @@ Test ---- .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/State +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/State_pattern \ No newline at end of file diff --git a/Behavioral/Strategy/index.rst b/Behavioral/Strategy/index.rst index c1a2fe3..55ad8fa 100644 --- a/Behavioral/Strategy/index.rst +++ b/Behavioral/Strategy/index.rst @@ -1,5 +1,5 @@ -Strategy -======== +Strategy |Wikipedia|_ +===================== Terminology: ------------ @@ -68,3 +68,7 @@ Tests/StrategyTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Strategy +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Strategy_pattern \ No newline at end of file diff --git a/Behavioral/TemplateMethod/index.rst b/Behavioral/TemplateMethod/index.rst index f3be5bc..497f09e 100644 --- a/Behavioral/TemplateMethod/index.rst +++ b/Behavioral/TemplateMethod/index.rst @@ -1,5 +1,5 @@ -Template Method -=============== +Template Method |Wikipedia|_ +============================ Purpose ------- @@ -61,3 +61,7 @@ Tests/JourneyTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/TemplateMethod +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Template_method_pattern \ No newline at end of file diff --git a/Behavioral/Visitor/index.rst b/Behavioral/Visitor/index.rst index 85fb280..0cf6c90 100644 --- a/Behavioral/Visitor/index.rst +++ b/Behavioral/Visitor/index.rst @@ -1,5 +1,5 @@ -Visitor -======= +Visitor |Wikipedia|_ +==================== Purpose ------- @@ -65,3 +65,7 @@ Tests/VisitorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Visitor +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Visitor_pattern \ No newline at end of file diff --git a/Creational/AbstractFactory/index.rst b/Creational/AbstractFactory/index.rst index e8d2000..65aba41 100644 --- a/Creational/AbstractFactory/index.rst +++ b/Creational/AbstractFactory/index.rst @@ -1,5 +1,5 @@ -Abstract Factory -================ +Abstract Factory |Wikipedia|_ +============================= Purpose ------- @@ -91,3 +91,7 @@ Tests/AbstractFactoryTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/AbstractFactory +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Abstract_factory_pattern \ No newline at end of file diff --git a/Creational/Builder/index.rst b/Creational/Builder/index.rst index 77fc308..2784669 100644 --- a/Creational/Builder/index.rst +++ b/Creational/Builder/index.rst @@ -1,5 +1,5 @@ -Builder -======= +Builder |Wikipedia|_ +==================== Purpose ------- @@ -102,3 +102,7 @@ Tests/DirectorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Builder +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Builder_pattern \ No newline at end of file diff --git a/Creational/FactoryMethod/index.rst b/Creational/FactoryMethod/index.rst index 693321f..0206e30 100644 --- a/Creational/FactoryMethod/index.rst +++ b/Creational/FactoryMethod/index.rst @@ -1,5 +1,5 @@ -Factory Method -============== +Factory Method |Wikipedia|_ +=========================== Purpose ------- @@ -80,3 +80,7 @@ Tests/FactoryMethodTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/FactoryMethod +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Factory_method_pattern \ No newline at end of file diff --git a/Creational/Pool/index.rst b/Creational/Pool/index.rst index 30d3be0..f41f91a 100644 --- a/Creational/Pool/index.rst +++ b/Creational/Pool/index.rst @@ -1,5 +1,5 @@ -Pool -==== +Pool |Wikipedia|_ +================= The **object pool pattern** is a software creational design pattern that uses a set of initialized objects kept ready to use – a "pool" – rather @@ -67,3 +67,7 @@ Tests/PoolTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Pool +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Object_pool_pattern diff --git a/Creational/Prototype/index.rst b/Creational/Prototype/index.rst index 31a98a3..b4c4a37 100644 --- a/Creational/Prototype/index.rst +++ b/Creational/Prototype/index.rst @@ -1,5 +1,5 @@ -Prototype -========= +Prototype |Wikipedia|_ +====================== Purpose ------- @@ -53,3 +53,7 @@ Test ---- .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Prototype +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Prototype_pattern \ No newline at end of file diff --git a/Creational/Singleton/index.rst b/Creational/Singleton/index.rst index 7393782..7700b4f 100644 --- a/Creational/Singleton/index.rst +++ b/Creational/Singleton/index.rst @@ -1,5 +1,5 @@ -Singleton -========= +Singleton |Wikipedia|_ +====================== **THIS IS CONSIDERED TO BE AN ANTI-PATTERN! FOR BETTER TESTABILITY AND MAINTAINABILITY USE DEPENDENCY INJECTION!** @@ -47,3 +47,7 @@ Tests/SingletonTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Singleton +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Singleton_pattern \ No newline at end of file diff --git a/More/Delegation/index.rst b/More/Delegation/index.rst index 873f3e2..63ce972 100644 --- a/More/Delegation/index.rst +++ b/More/Delegation/index.rst @@ -1,5 +1,5 @@ -Delegation -========== +Delegation |Wikipedia|_ +======================= Purpose ------- @@ -51,3 +51,7 @@ Tests/DelegationTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/More/Delegation +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Delegation_pattern \ No newline at end of file diff --git a/More/ServiceLocator/index.rst b/More/ServiceLocator/index.rst index 96bad04..da46086 100644 --- a/More/ServiceLocator/index.rst +++ b/More/ServiceLocator/index.rst @@ -1,5 +1,5 @@ -Service Locator -=============== +Service Locator |Wikipedia|_ +============================ Purpose ------- @@ -81,3 +81,7 @@ Tests/ServiceLocatorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/More/ServiceLocator +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Service_locator_pattern \ No newline at end of file diff --git a/Structural/Adapter/index.rst b/Structural/Adapter/index.rst index 5d843dd..d160833 100644 --- a/Structural/Adapter/index.rst +++ b/Structural/Adapter/index.rst @@ -1,5 +1,5 @@ -Adapter / Wrapper -================= +Adapter / Wrapper |Wikipedia|_ +============================== Purpose ------- @@ -68,3 +68,7 @@ Tests/AdapterTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Adapter +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Adapter_pattern \ No newline at end of file diff --git a/Structural/Bridge/index.rst b/Structural/Bridge/index.rst index 5fb8cfe..0a08767 100644 --- a/Structural/Bridge/index.rst +++ b/Structural/Bridge/index.rst @@ -1,5 +1,5 @@ -Bridge -====== +Bridge |Wikipedia|_ +=================== Purpose ------- @@ -71,3 +71,7 @@ Tests/BridgeTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Bridge +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Bridge_pattern \ No newline at end of file diff --git a/Structural/Composite/index.rst b/Structural/Composite/index.rst index ff91f66..05fa9a9 100644 --- a/Structural/Composite/index.rst +++ b/Structural/Composite/index.rst @@ -1,5 +1,5 @@ -Composite -========= +Composite |Wikipedia|_ +====================== Purpose ------- @@ -62,3 +62,7 @@ Tests/CompositeTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Composite +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Composite_pattern \ No newline at end of file diff --git a/Structural/DataMapper/index.rst b/Structural/DataMapper/index.rst index cd51e7a..9d99a63 100644 --- a/Structural/DataMapper/index.rst +++ b/Structural/DataMapper/index.rst @@ -1,5 +1,5 @@ -Data Mapper -=========== +Data Mapper |Wikipedia|_ +======================== Purpose ------- @@ -57,3 +57,7 @@ Tests/DataMapperTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/DataMapper +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Data_mapper_pattern \ No newline at end of file diff --git a/Structural/Decorator/index.rst b/Structural/Decorator/index.rst index 6ace194..a39bc60 100644 --- a/Structural/Decorator/index.rst +++ b/Structural/Decorator/index.rst @@ -1,5 +1,5 @@ -Decorator -========= +Decorator |Wikipedia|_ +====================== Purpose ------- @@ -65,3 +65,7 @@ Tests/DecoratorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Decorator +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Decorator_pattern \ No newline at end of file diff --git a/Structural/DependencyInjection/index.rst b/Structural/DependencyInjection/index.rst index 544cc64..49dc35e 100644 --- a/Structural/DependencyInjection/index.rst +++ b/Structural/DependencyInjection/index.rst @@ -1,5 +1,5 @@ -Dependency Injection -==================== +Dependency Injection |Wikipedia|_ +================================= Purpose ------- @@ -85,3 +85,7 @@ Tests/config.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/DependencyInjection +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Dependency_injection \ No newline at end of file diff --git a/Structural/Facade/index.rst b/Structural/Facade/index.rst index 6df49cc..6926172 100644 --- a/Structural/Facade/index.rst +++ b/Structural/Facade/index.rst @@ -1,5 +1,5 @@ -Facade -====== +Facade |Wikipedia|_ +=================== Purpose ------- @@ -63,3 +63,7 @@ Tests/FacadeTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Facade +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Facade_pattern \ No newline at end of file diff --git a/Structural/FluentInterface/index.rst b/Structural/FluentInterface/index.rst index 80adfbe..b3650a1 100644 --- a/Structural/FluentInterface/index.rst +++ b/Structural/FluentInterface/index.rst @@ -1,5 +1,5 @@ -Fluent Interface -================ +Fluent Interface |Wikipedia|_ +============================= Purpose ------- @@ -43,3 +43,7 @@ Tests/FluentInterfaceTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/FluentInterface +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Fluent_interface \ No newline at end of file diff --git a/Structural/Proxy/index.rst b/Structural/Proxy/index.rst index a7ce379..5dababc 100644 --- a/Structural/Proxy/index.rst +++ b/Structural/Proxy/index.rst @@ -1,5 +1,5 @@ -Proxy -===== +Proxy |Wikipedia|_ +================== Purpose ------- @@ -41,3 +41,7 @@ Test ---- .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Proxy +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Proxy_pattern \ No newline at end of file diff --git a/Structural/Registry/index.rst b/Structural/Registry/index.rst index b63e1c6..3ad1443 100644 --- a/Structural/Registry/index.rst +++ b/Structural/Registry/index.rst @@ -1,5 +1,5 @@ -Registry -======== +Registry |Wikipedia|_ +===================== Purpose ------- @@ -44,3 +44,7 @@ Tests/RegistryTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Registry +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 30 px + :width: 30 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Service_locator_pattern \ No newline at end of file diff --git a/_static/Wikipedia-logo.png b/_static/Wikipedia-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7eeeecd33a5ec236f56992ceeda71634cd36f99a GIT binary patch literal 43627 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 -for a full explanation of the pattern on Wikipedia. +Please click |Wikipedia|_ for a full explanation of the pattern on Wikipedia. .. toctree:: :titlesonly: @@ -69,3 +67,8 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +.. |Wikipedia| image:: /_static/Wikipedia-logo.png + :height: 20 px + :width: 20 px +.. _Wikipedia: http://en.wikipedia.org/wiki/Software_design_pattern From 818c221c788e0ee8eabf063ea1f1eb635c1e8cd9 Mon Sep 17 00:00:00 2001 From: Faust Date: Sun, 5 Apr 2015 03:29:00 +0200 Subject: [PATCH 10/14] fix wikipedia links for pdf version --- Behavioral/ChainOfResponsibilities/index.rst | 9 +++------ Behavioral/Command/index.rst | 9 +++------ Behavioral/Iterator/index.rst | 9 +++------ Behavioral/Mediator/index.rst | 9 +++------ Behavioral/Memento/index.rst | 9 +++------ Behavioral/NullObject/index.rst | 9 +++------ Behavioral/Observer/index.rst | 9 +++------ Behavioral/Specification/index.rst | 9 +++------ Behavioral/State/index.rst | 9 +++------ Behavioral/Strategy/index.rst | 9 +++------ Behavioral/TemplateMethod/index.rst | 9 +++------ Behavioral/Visitor/index.rst | 9 +++------ Creational/AbstractFactory/index.rst | 9 +++------ Creational/Builder/index.rst | 9 +++------ Creational/FactoryMethod/index.rst | 9 +++------ Creational/Pool/index.rst | 9 +++------ Creational/Prototype/index.rst | 9 +++------ Creational/Singleton/index.rst | 9 +++------ More/Delegation/index.rst | 9 +++------ More/ServiceLocator/index.rst | 9 +++------ README.md | 4 ++-- Structural/Adapter/index.rst | 9 +++------ Structural/Bridge/index.rst | 9 +++------ Structural/Composite/index.rst | 9 +++------ Structural/DataMapper/index.rst | 9 +++------ Structural/Decorator/index.rst | 9 +++------ Structural/DependencyInjection/index.rst | 9 +++------ Structural/Facade/index.rst | 9 +++------ Structural/FluentInterface/index.rst | 10 ++++------ Structural/Proxy/index.rst | 9 +++------ Structural/Registry/index.rst | 9 +++------ _static/Wikipedia-logo.png | Bin 43627 -> 0 bytes conf.py | 2 +- index.rst | 14 ++++++-------- 34 files changed, 100 insertions(+), 191 deletions(-) delete mode 100644 _static/Wikipedia-logo.png diff --git a/Behavioral/ChainOfResponsibilities/index.rst b/Behavioral/ChainOfResponsibilities/index.rst index efeff83..582faec 100644 --- a/Behavioral/ChainOfResponsibilities/index.rst +++ b/Behavioral/ChainOfResponsibilities/index.rst @@ -1,5 +1,5 @@ -Chain Of Responsibilities |Wikipedia|_ -====================================== +`Chain Of Responsibilities`_ +============================ Purpose: -------- @@ -67,7 +67,4 @@ Tests/ChainTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/ChainOfResponsibilities -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Chain_of_responsibility_pattern \ No newline at end of file +.. _`Chain Of Responsibilities`: http://en.wikipedia.org/wiki/Chain_of_responsibility_pattern \ No newline at end of file diff --git a/Behavioral/Command/index.rst b/Behavioral/Command/index.rst index f6d041e..fc93d8e 100644 --- a/Behavioral/Command/index.rst +++ b/Behavioral/Command/index.rst @@ -1,5 +1,5 @@ -Command |Wikipedia|_ -==================== +`Command`_ +========== Purpose ------- @@ -74,7 +74,4 @@ Tests/CommandTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Command -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Command_pattern \ No newline at end of file +.. _`Command`: http://en.wikipedia.org/wiki/Command_pattern \ No newline at end of file diff --git a/Behavioral/Iterator/index.rst b/Behavioral/Iterator/index.rst index 3ef9e72..cb5195a 100644 --- a/Behavioral/Iterator/index.rst +++ b/Behavioral/Iterator/index.rst @@ -1,5 +1,5 @@ -Iterator |Wikipedia|_ -===================== +`Iterator`_ +=========== Purpose ------- @@ -67,7 +67,4 @@ Tests/IteratorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Iterator -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Iterator_pattern \ No newline at end of file +.. _`Iterator`: http://en.wikipedia.org/wiki/Iterator_pattern \ No newline at end of file diff --git a/Behavioral/Mediator/index.rst b/Behavioral/Mediator/index.rst index 77c7aaf..05277dc 100644 --- a/Behavioral/Mediator/index.rst +++ b/Behavioral/Mediator/index.rst @@ -1,5 +1,5 @@ -Mediator |Wikipedia|_ -===================== +`Mediator`_ +=========== Purpose ------- @@ -70,7 +70,4 @@ Tests/MediatorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Mediator -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Mediator_pattern \ No newline at end of file +.. _`Mediator`: http://en.wikipedia.org/wiki/Mediator_pattern \ No newline at end of file diff --git a/Behavioral/Memento/index.rst b/Behavioral/Memento/index.rst index d5ce670..50b8046 100644 --- a/Behavioral/Memento/index.rst +++ b/Behavioral/Memento/index.rst @@ -1,5 +1,5 @@ -Memento |Wikipedia|_ -==================== +`Memento`_ +========== Purpose ------- @@ -65,7 +65,4 @@ Tests/MementoTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Memento -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Memento_pattern \ No newline at end of file +.. _`Memento`: http://en.wikipedia.org/wiki/Memento_pattern \ No newline at end of file diff --git a/Behavioral/NullObject/index.rst b/Behavioral/NullObject/index.rst index 15d8eaf..c969326 100644 --- a/Behavioral/NullObject/index.rst +++ b/Behavioral/NullObject/index.rst @@ -1,5 +1,5 @@ -Null Object |Wikipedia|_ -======================== +`Null Object`_ +============== Purpose ------- @@ -72,7 +72,4 @@ Tests/LoggerTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/NullObject -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Null_Object_pattern \ No newline at end of file +.. _`Null Object`: http://en.wikipedia.org/wiki/Null_Object_pattern \ No newline at end of file diff --git a/Behavioral/Observer/index.rst b/Behavioral/Observer/index.rst index 4a9225f..00dd00d 100644 --- a/Behavioral/Observer/index.rst +++ b/Behavioral/Observer/index.rst @@ -1,5 +1,5 @@ -Observer |Wikipedia|_ -===================== +`Observer`_ +=========== Purpose ------- @@ -55,7 +55,4 @@ Tests/ObserverTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Observer -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Observer_pattern \ No newline at end of file +.. _`Observer`: http://en.wikipedia.org/wiki/Observer_pattern \ No newline at end of file diff --git a/Behavioral/Specification/index.rst b/Behavioral/Specification/index.rst index 167ce76..2aac692 100644 --- a/Behavioral/Specification/index.rst +++ b/Behavioral/Specification/index.rst @@ -1,5 +1,5 @@ -Specification |Wikipedia|_ -========================== +`Specification`_ +================ Purpose ------- @@ -73,7 +73,4 @@ Tests/SpecificationTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Specification -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Specification_pattern \ No newline at end of file +.. _`Specification`: http://en.wikipedia.org/wiki/Specification_pattern \ No newline at end of file diff --git a/Behavioral/State/index.rst b/Behavioral/State/index.rst index 6815f38..ff7185e 100644 --- a/Behavioral/State/index.rst +++ b/Behavioral/State/index.rst @@ -1,5 +1,5 @@ -State |Wikipedia|_ -================== +`State`_ +======== Purpose ------- @@ -54,7 +54,4 @@ Test ---- .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/State -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/State_pattern \ No newline at end of file +.. _`State`: http://en.wikipedia.org/wiki/State_pattern \ No newline at end of file diff --git a/Behavioral/Strategy/index.rst b/Behavioral/Strategy/index.rst index 55ad8fa..3853771 100644 --- a/Behavioral/Strategy/index.rst +++ b/Behavioral/Strategy/index.rst @@ -1,5 +1,5 @@ -Strategy |Wikipedia|_ -===================== +`Strategy`_ +=========== Terminology: ------------ @@ -68,7 +68,4 @@ Tests/StrategyTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Strategy -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Strategy_pattern \ No newline at end of file +.. _`Strategy`: http://en.wikipedia.org/wiki/Strategy_pattern \ No newline at end of file diff --git a/Behavioral/TemplateMethod/index.rst b/Behavioral/TemplateMethod/index.rst index 497f09e..0239c0f 100644 --- a/Behavioral/TemplateMethod/index.rst +++ b/Behavioral/TemplateMethod/index.rst @@ -1,5 +1,5 @@ -Template Method |Wikipedia|_ -============================ +`Template Method`_ +================== Purpose ------- @@ -61,7 +61,4 @@ Tests/JourneyTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/TemplateMethod -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Template_method_pattern \ No newline at end of file +.. _`Template Method`: http://en.wikipedia.org/wiki/Template_method_pattern \ No newline at end of file diff --git a/Behavioral/Visitor/index.rst b/Behavioral/Visitor/index.rst index 0cf6c90..4fca151 100644 --- a/Behavioral/Visitor/index.rst +++ b/Behavioral/Visitor/index.rst @@ -1,5 +1,5 @@ -Visitor |Wikipedia|_ -==================== +`Visitor`_ +========== Purpose ------- @@ -65,7 +65,4 @@ Tests/VisitorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Behavioral/Visitor -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Visitor_pattern \ No newline at end of file +.. _`Visitor`: http://en.wikipedia.org/wiki/Visitor_pattern \ No newline at end of file diff --git a/Creational/AbstractFactory/index.rst b/Creational/AbstractFactory/index.rst index 65aba41..9942e4c 100644 --- a/Creational/AbstractFactory/index.rst +++ b/Creational/AbstractFactory/index.rst @@ -1,5 +1,5 @@ -Abstract Factory |Wikipedia|_ -============================= +`Abstract Factory`_ +=================== Purpose ------- @@ -91,7 +91,4 @@ Tests/AbstractFactoryTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/AbstractFactory -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Abstract_factory_pattern \ No newline at end of file +.. _`Abstract Factory`: http://en.wikipedia.org/wiki/Abstract_factory_pattern \ No newline at end of file diff --git a/Creational/Builder/index.rst b/Creational/Builder/index.rst index 2784669..03a1030 100644 --- a/Creational/Builder/index.rst +++ b/Creational/Builder/index.rst @@ -1,5 +1,5 @@ -Builder |Wikipedia|_ -==================== +`Builder`_ +========== Purpose ------- @@ -102,7 +102,4 @@ Tests/DirectorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Builder -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Builder_pattern \ No newline at end of file +.. _`Builder`: http://en.wikipedia.org/wiki/Builder_pattern \ No newline at end of file diff --git a/Creational/FactoryMethod/index.rst b/Creational/FactoryMethod/index.rst index 0206e30..7552078 100644 --- a/Creational/FactoryMethod/index.rst +++ b/Creational/FactoryMethod/index.rst @@ -1,5 +1,5 @@ -Factory Method |Wikipedia|_ -=========================== +`Factory Method`_ +================= Purpose ------- @@ -80,7 +80,4 @@ Tests/FactoryMethodTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/FactoryMethod -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Factory_method_pattern \ No newline at end of file +.. _`Factory Method`: http://en.wikipedia.org/wiki/Factory_method_pattern \ No newline at end of file diff --git a/Creational/Pool/index.rst b/Creational/Pool/index.rst index f41f91a..6912c72 100644 --- a/Creational/Pool/index.rst +++ b/Creational/Pool/index.rst @@ -1,5 +1,5 @@ -Pool |Wikipedia|_ -================= +`Pool`_ +======= The **object pool pattern** is a software creational design pattern that uses a set of initialized objects kept ready to use – a "pool" – rather @@ -67,7 +67,4 @@ Tests/PoolTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Pool -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Object_pool_pattern +.. _`Pool`: http://en.wikipedia.org/wiki/Object_pool_pattern diff --git a/Creational/Prototype/index.rst b/Creational/Prototype/index.rst index b4c4a37..5485edd 100644 --- a/Creational/Prototype/index.rst +++ b/Creational/Prototype/index.rst @@ -1,5 +1,5 @@ -Prototype |Wikipedia|_ -====================== +`Prototype`_ +============ Purpose ------- @@ -53,7 +53,4 @@ Test ---- .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Prototype -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Prototype_pattern \ No newline at end of file +.. _`Prototype`: http://en.wikipedia.org/wiki/Prototype_pattern \ No newline at end of file diff --git a/Creational/Singleton/index.rst b/Creational/Singleton/index.rst index 7700b4f..319364e 100644 --- a/Creational/Singleton/index.rst +++ b/Creational/Singleton/index.rst @@ -1,5 +1,5 @@ -Singleton |Wikipedia|_ -====================== +`Singleton`_ +============ **THIS IS CONSIDERED TO BE AN ANTI-PATTERN! FOR BETTER TESTABILITY AND MAINTAINABILITY USE DEPENDENCY INJECTION!** @@ -47,7 +47,4 @@ Tests/SingletonTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Singleton -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Singleton_pattern \ No newline at end of file +.. _`Singleton`: http://en.wikipedia.org/wiki/Singleton_pattern \ No newline at end of file diff --git a/More/Delegation/index.rst b/More/Delegation/index.rst index 63ce972..149cddf 100644 --- a/More/Delegation/index.rst +++ b/More/Delegation/index.rst @@ -1,5 +1,5 @@ -Delegation |Wikipedia|_ -======================= +`Delegation`_ +============= Purpose ------- @@ -51,7 +51,4 @@ Tests/DelegationTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/More/Delegation -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Delegation_pattern \ No newline at end of file +.. _`Delegation`: http://en.wikipedia.org/wiki/Delegation_pattern \ No newline at end of file diff --git a/More/ServiceLocator/index.rst b/More/ServiceLocator/index.rst index da46086..2972391 100644 --- a/More/ServiceLocator/index.rst +++ b/More/ServiceLocator/index.rst @@ -1,5 +1,5 @@ -Service Locator |Wikipedia|_ -============================ +`Service Locator`_ +================== Purpose ------- @@ -81,7 +81,4 @@ Tests/ServiceLocatorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/More/ServiceLocator -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Service_locator_pattern \ No newline at end of file +.. _`Service Locator`: http://en.wikipedia.org/wiki/Service_locator_pattern \ No newline at end of file diff --git a/README.md b/README.md index 05e3d11..55200f4 100755 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ [![Build Status](https://travis-ci.org/domnikl/DesignPatternsPHP.png?branch=master)](https://travis-ci.org/domnikl/DesignPatternsPHP) -[Read the Docs of DesignPatternsPHP](http://designpatterns-php.readthedocs.org) -or [Download as PDF/Epub](https://readthedocs.org/projects/designpatterns-php/downloads/) +[Read the Docs of DesignPatternsPHP](http://designpatternsphp.readthedocs.org) +or [Download as PDF/Epub](https://readthedocs.org/projects/designpatternsphp/downloads/) This is a collection of known design patterns and some sample code how to implement them in PHP. Every pattern has a small list of examples (most of them from Zend Framework, Symfony2 or Doctrine2 as I'm most familiar with this software). diff --git a/Structural/Adapter/index.rst b/Structural/Adapter/index.rst index d160833..2aa2ea5 100644 --- a/Structural/Adapter/index.rst +++ b/Structural/Adapter/index.rst @@ -1,5 +1,5 @@ -Adapter / Wrapper |Wikipedia|_ -============================== +`Adapter / Wrapper`_ +==================== Purpose ------- @@ -68,7 +68,4 @@ Tests/AdapterTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Adapter -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Adapter_pattern \ No newline at end of file +.. _`Adapter / Wrapper`: http://en.wikipedia.org/wiki/Adapter_pattern \ No newline at end of file diff --git a/Structural/Bridge/index.rst b/Structural/Bridge/index.rst index 0a08767..62b8056 100644 --- a/Structural/Bridge/index.rst +++ b/Structural/Bridge/index.rst @@ -1,5 +1,5 @@ -Bridge |Wikipedia|_ -=================== +`Bridge`_ +========= Purpose ------- @@ -71,7 +71,4 @@ Tests/BridgeTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Bridge -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Bridge_pattern \ No newline at end of file +.. _`Bridge`: http://en.wikipedia.org/wiki/Bridge_pattern \ No newline at end of file diff --git a/Structural/Composite/index.rst b/Structural/Composite/index.rst index 05fa9a9..6c4af7d 100644 --- a/Structural/Composite/index.rst +++ b/Structural/Composite/index.rst @@ -1,5 +1,5 @@ -Composite |Wikipedia|_ -====================== +`Composite`_ +============ Purpose ------- @@ -62,7 +62,4 @@ Tests/CompositeTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Composite -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Composite_pattern \ No newline at end of file +.. _`Composite`: http://en.wikipedia.org/wiki/Composite_pattern \ No newline at end of file diff --git a/Structural/DataMapper/index.rst b/Structural/DataMapper/index.rst index 9d99a63..dcc24de 100644 --- a/Structural/DataMapper/index.rst +++ b/Structural/DataMapper/index.rst @@ -1,5 +1,5 @@ -Data Mapper |Wikipedia|_ -======================== +`Data Mapper`_ +============== Purpose ------- @@ -57,7 +57,4 @@ Tests/DataMapperTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/DataMapper -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Data_mapper_pattern \ No newline at end of file +.. _`Data Mapper`: http://en.wikipedia.org/wiki/Data_mapper_pattern \ No newline at end of file diff --git a/Structural/Decorator/index.rst b/Structural/Decorator/index.rst index a39bc60..cb9d92b 100644 --- a/Structural/Decorator/index.rst +++ b/Structural/Decorator/index.rst @@ -1,5 +1,5 @@ -Decorator |Wikipedia|_ -====================== +`Decorator`_ +============ Purpose ------- @@ -65,7 +65,4 @@ Tests/DecoratorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Decorator -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Decorator_pattern \ No newline at end of file +.. _`Decorator`: http://en.wikipedia.org/wiki/Decorator_pattern \ No newline at end of file diff --git a/Structural/DependencyInjection/index.rst b/Structural/DependencyInjection/index.rst index 49dc35e..bc7ddff 100644 --- a/Structural/DependencyInjection/index.rst +++ b/Structural/DependencyInjection/index.rst @@ -1,5 +1,5 @@ -Dependency Injection |Wikipedia|_ -================================= +`Dependency Injection`_ +======================= Purpose ------- @@ -85,7 +85,4 @@ Tests/config.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/DependencyInjection -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Dependency_injection \ No newline at end of file +.. _`Dependency Injection`: http://en.wikipedia.org/wiki/Dependency_injection \ No newline at end of file diff --git a/Structural/Facade/index.rst b/Structural/Facade/index.rst index 6926172..e2baeca 100644 --- a/Structural/Facade/index.rst +++ b/Structural/Facade/index.rst @@ -1,5 +1,5 @@ -Facade |Wikipedia|_ -=================== +`Facade`_ +========= Purpose ------- @@ -63,7 +63,4 @@ Tests/FacadeTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Facade -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Facade_pattern \ No newline at end of file +.. _`Facade`: http://en.wikipedia.org/wiki/Facade_pattern \ No newline at end of file diff --git a/Structural/FluentInterface/index.rst b/Structural/FluentInterface/index.rst index b3650a1..a1dd9c8 100644 --- a/Structural/FluentInterface/index.rst +++ b/Structural/FluentInterface/index.rst @@ -1,5 +1,5 @@ -Fluent Interface |Wikipedia|_ -============================= +`Fluent Interface`_ +=================== Purpose ------- @@ -43,7 +43,5 @@ Tests/FluentInterfaceTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/FluentInterface -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Fluent_interface \ No newline at end of file + +.. _`Fluent Interface`: http://en.wikipedia.org/wiki/Fluent_interface \ No newline at end of file diff --git a/Structural/Proxy/index.rst b/Structural/Proxy/index.rst index 5dababc..4ff818e 100644 --- a/Structural/Proxy/index.rst +++ b/Structural/Proxy/index.rst @@ -1,5 +1,5 @@ -Proxy |Wikipedia|_ -================== +`Proxy`_ +======== Purpose ------- @@ -41,7 +41,4 @@ Test ---- .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Proxy -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Proxy_pattern \ No newline at end of file +.. _`Proxy`: http://en.wikipedia.org/wiki/Proxy_pattern \ No newline at end of file diff --git a/Structural/Registry/index.rst b/Structural/Registry/index.rst index 3ad1443..f09bd2f 100644 --- a/Structural/Registry/index.rst +++ b/Structural/Registry/index.rst @@ -1,5 +1,5 @@ -Registry |Wikipedia|_ -===================== +`Registry`_ +=========== Purpose ------- @@ -44,7 +44,4 @@ Tests/RegistryTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Registry -.. |Wikipedia| image:: /_static/Wikipedia-logo.png - :height: 30 px - :width: 30 px -.. _Wikipedia: http://en.wikipedia.org/wiki/Service_locator_pattern \ No newline at end of file +.. _`Registry`: http://en.wikipedia.org/wiki/Service_locator_pattern \ No newline at end of file diff --git a/_static/Wikipedia-logo.png b/_static/Wikipedia-logo.png deleted file mode 100644 index 7eeeecd33a5ec236f56992ceeda71634cd36f99a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43627 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 Date: Sun, 5 Apr 2015 06:05:24 +0200 Subject: [PATCH 11/14] Change index.rst to README.rst remove all pattern's README.md --- Behavioral/ChainOfResponsibilities/README.md | 16 ------ .../{index.rst => README.rst} | 0 Behavioral/Command/README.md | 21 -------- Behavioral/Command/{index.rst => README.rst} | 0 Behavioral/Iterator/README.md | 17 ------ Behavioral/Iterator/{index.rst => README.rst} | 0 Behavioral/Mediator/README.md | 15 ------ Behavioral/Mediator/{index.rst => README.rst} | 0 Behavioral/Memento/README.md | 22 -------- Behavioral/Memento/{index.rst => README.rst} | 0 Behavioral/NullObject/README.md | 22 -------- .../NullObject/{index.rst => README.rst} | 0 Behavioral/Observer/README.md | 18 ------- Behavioral/Observer/{index.rst => README.rst} | 0 Behavioral/{index.rst => README.rst} | 24 ++++----- Behavioral/Specification/README.md | 10 ---- .../Specification/{index.rst => README.rst} | 0 Behavioral/State/README.md | 9 ---- Behavioral/State/{index.rst => README.rst} | 0 Behavioral/Strategy/README.md | 20 ------- Behavioral/Strategy/{index.rst => README.rst} | 0 Behavioral/TemplateMethod/README.md | 18 ------- .../TemplateMethod/{index.rst => README.rst} | 0 Behavioral/Visitor/README.md | 12 ----- Behavioral/Visitor/{index.rst => README.rst} | 0 Creational/AbstractFactory/README.md | 10 ---- .../AbstractFactory/{index.rst => README.rst} | 0 Creational/Builder/Parts/README.md | 10 ---- Creational/Builder/README.md | 19 ------- Creational/Builder/{index.rst => README.rst} | 0 Creational/FactoryMethod/README.md | 15 ------ .../FactoryMethod/{index.rst => README.rst} | 0 Creational/Multiton/README.md | 16 ------ Creational/Multiton/{index.rst => README.rst} | 0 Creational/Pool/README.md | 12 ----- Creational/Pool/{index.rst => README.rst} | 0 Creational/Prototype/README.md | 13 ----- .../Prototype/{index.rst => README.rst} | 0 Creational/{index.rst => README.rst} | 18 +++---- Creational/SimpleFactory/README.md | 13 ----- .../SimpleFactory/{index.rst => README.rst} | 0 Creational/Singleton/README.md | 17 ------ .../Singleton/{index.rst => README.rst} | 0 Creational/StaticFactory/README.md | 15 ------ .../StaticFactory/{index.rst => README.rst} | 0 More/Delegation/README.md | 13 ----- More/Delegation/{index.rst => README.rst} | 0 More/README.rst | 9 ++++ More/Repository/README.md | 16 ------ More/Repository/{index.rst => README.rst} | 0 More/ServiceLocator/README.md | 20 ------- More/ServiceLocator/{index.rst => README.rst} | 0 More/index.rst | 9 ---- index.rst => README.rst | 8 +-- Structural/Adapter/README.md | 14 ----- Structural/Adapter/{index.rst => README.rst} | 0 Structural/Bridge/README.md | 12 ----- Structural/Bridge/{index.rst => README.rst} | 0 Structural/Composite/README.md | 15 ------ .../Composite/{index.rst => README.rst} | 0 Structural/DataMapper/README.md | 22 -------- .../DataMapper/{index.rst => README.rst} | 0 Structural/Decorator/README.md | 14 ----- .../Decorator/{index.rst => README.rst} | 0 Structural/DependencyInjection/README.md | 20 ------- .../{index.rst => README.rst} | 0 Structural/Facade/README.md | 21 -------- Structural/Facade/{index.rst => README.rst} | 0 Structural/FluentInterface/README.md | 15 ------ .../FluentInterface/{index.rst => README.rst} | 0 Structural/Proxy/README.md | 13 ----- Structural/Proxy/{index.rst => README.rst} | 0 Structural/{index.rst => README.rst} | 20 +++---- Structural/Registry/README.md | 15 ------ Structural/Registry/{index.rst => README.rst} | 0 conf.py | 2 +- read-the-docs.sh | 52 ------------------- 77 files changed, 45 insertions(+), 647 deletions(-) delete mode 100644 Behavioral/ChainOfResponsibilities/README.md rename Behavioral/ChainOfResponsibilities/{index.rst => README.rst} (100%) delete mode 100644 Behavioral/Command/README.md rename Behavioral/Command/{index.rst => README.rst} (100%) delete mode 100644 Behavioral/Iterator/README.md rename Behavioral/Iterator/{index.rst => README.rst} (100%) delete mode 100644 Behavioral/Mediator/README.md rename Behavioral/Mediator/{index.rst => README.rst} (100%) delete mode 100644 Behavioral/Memento/README.md rename Behavioral/Memento/{index.rst => README.rst} (100%) delete mode 100644 Behavioral/NullObject/README.md rename Behavioral/NullObject/{index.rst => README.rst} (100%) delete mode 100644 Behavioral/Observer/README.md rename Behavioral/Observer/{index.rst => README.rst} (100%) rename Behavioral/{index.rst => README.rst} (54%) delete mode 100644 Behavioral/Specification/README.md rename Behavioral/Specification/{index.rst => README.rst} (100%) delete mode 100644 Behavioral/State/README.md rename Behavioral/State/{index.rst => README.rst} (100%) delete mode 100644 Behavioral/Strategy/README.md rename Behavioral/Strategy/{index.rst => README.rst} (100%) delete mode 100644 Behavioral/TemplateMethod/README.md rename Behavioral/TemplateMethod/{index.rst => README.rst} (100%) delete mode 100644 Behavioral/Visitor/README.md rename Behavioral/Visitor/{index.rst => README.rst} (100%) delete mode 100644 Creational/AbstractFactory/README.md rename Creational/AbstractFactory/{index.rst => README.rst} (100%) delete mode 100644 Creational/Builder/Parts/README.md delete mode 100644 Creational/Builder/README.md rename Creational/Builder/{index.rst => README.rst} (100%) delete mode 100644 Creational/FactoryMethod/README.md rename Creational/FactoryMethod/{index.rst => README.rst} (100%) delete mode 100644 Creational/Multiton/README.md rename Creational/Multiton/{index.rst => README.rst} (100%) delete mode 100644 Creational/Pool/README.md rename Creational/Pool/{index.rst => README.rst} (100%) delete mode 100644 Creational/Prototype/README.md rename Creational/Prototype/{index.rst => README.rst} (100%) rename Creational/{index.rst => README.rst} (69%) delete mode 100644 Creational/SimpleFactory/README.md rename Creational/SimpleFactory/{index.rst => README.rst} (100%) delete mode 100644 Creational/Singleton/README.md rename Creational/Singleton/{index.rst => README.rst} (100%) delete mode 100644 Creational/StaticFactory/README.md rename Creational/StaticFactory/{index.rst => README.rst} (100%) delete mode 100644 More/Delegation/README.md rename More/Delegation/{index.rst => README.rst} (100%) create mode 100644 More/README.rst delete mode 100644 More/Repository/README.md rename More/Repository/{index.rst => README.rst} (100%) delete mode 100644 More/ServiceLocator/README.md rename More/ServiceLocator/{index.rst => README.rst} (100%) delete mode 100644 More/index.rst rename index.rst => README.rst (97%) delete mode 100644 Structural/Adapter/README.md rename Structural/Adapter/{index.rst => README.rst} (100%) delete mode 100644 Structural/Bridge/README.md rename Structural/Bridge/{index.rst => README.rst} (100%) delete mode 100755 Structural/Composite/README.md rename Structural/Composite/{index.rst => README.rst} (100%) delete mode 100644 Structural/DataMapper/README.md rename Structural/DataMapper/{index.rst => README.rst} (100%) delete mode 100644 Structural/Decorator/README.md rename Structural/Decorator/{index.rst => README.rst} (100%) delete mode 100644 Structural/DependencyInjection/README.md rename Structural/DependencyInjection/{index.rst => README.rst} (100%) delete mode 100644 Structural/Facade/README.md rename Structural/Facade/{index.rst => README.rst} (100%) delete mode 100644 Structural/FluentInterface/README.md rename Structural/FluentInterface/{index.rst => README.rst} (100%) delete mode 100644 Structural/Proxy/README.md rename Structural/Proxy/{index.rst => README.rst} (100%) rename Structural/{index.rst => README.rst} (51%) delete mode 100644 Structural/Registry/README.md rename Structural/Registry/{index.rst => README.rst} (100%) delete mode 100755 read-the-docs.sh diff --git a/Behavioral/ChainOfResponsibilities/README.md b/Behavioral/ChainOfResponsibilities/README.md deleted file mode 100644 index 7657e93..0000000 --- a/Behavioral/ChainOfResponsibilities/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Chain Of Responsibilities - -## Purpose: - -To build a chain of objects to handle a call in sequential order. If one object cannot handle a call, it delegates the call to the next in the chain and so forth. - -## Examples: - -* logging framework, where each chain element decides autonomously what to do with a log message -* a Spam filter -* Caching: first object is an instance of e.g. a Memcached Interface, if that "misses" it delegates the call to the database interface -* Yii Framework: CFilterChain is a chain of controller action filters. the executing point is passed from one filter to the next along the chain, and only if all filters say "yes", the action can be invoked at last. - -## UML Diagram - -![Alt ChainOfResponsibility UML Diagram](uml/uml.png) diff --git a/Behavioral/ChainOfResponsibilities/index.rst b/Behavioral/ChainOfResponsibilities/README.rst similarity index 100% rename from Behavioral/ChainOfResponsibilities/index.rst rename to Behavioral/ChainOfResponsibilities/README.rst diff --git a/Behavioral/Command/README.md b/Behavioral/Command/README.md deleted file mode 100644 index adf2de3..0000000 --- a/Behavioral/Command/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Command - -## Purpose - -To encapsulate invocation and decoupling. - -We have an Invoker and a Receiver. This pattern uses a "Command" to delegate the method call against the Receiver and presents the same method "execute". -Therefore, the Invoker just knows to call "execute" to process the Command of the client. The Receiver is decoupled from the Invoker. - -The second aspect of this pattern is the undo(), which undoes the method execute(). -Command can also be aggregated to combine more complex commands with minimum copy-paste and relying on composition over inheritance. - -## Examples - -* A text editor : all events are Command which can be undone, stacked and saved. -* Symfony2: SF2 Commands that can be run from the CLI are built with just the Command pattern in mind -* big CLI tools use subcommands to distribute various tasks and pack them in "modules", each of these can be implemented with the Command pattern (e.g. vagrant) - -## UML Diagram - -![Alt Command UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Behavioral/Command/index.rst b/Behavioral/Command/README.rst similarity index 100% rename from Behavioral/Command/index.rst rename to Behavioral/Command/README.rst diff --git a/Behavioral/Iterator/README.md b/Behavioral/Iterator/README.md deleted file mode 100644 index 46e96b8..0000000 --- a/Behavioral/Iterator/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Iterator - -## Purpose - -To make an object iterable and to make it appear like a collection of objects. - -## Examples - -* to process a file line by line by just running over all lines (which have an object representation) for a file (which of course is an object, too) - -## Note - -Standard PHP Library (SPL) defines an interface Iterator which is best suited for this! Often you would want to implement the Countable interface too, to allow `count($object)` on your iterable object - -## UML Diagram - -![Alt Iterator UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Behavioral/Iterator/index.rst b/Behavioral/Iterator/README.rst similarity index 100% rename from Behavioral/Iterator/index.rst rename to Behavioral/Iterator/README.rst diff --git a/Behavioral/Mediator/README.md b/Behavioral/Mediator/README.md deleted file mode 100644 index 818ff4c..0000000 --- a/Behavioral/Mediator/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Mediator - -## Purpose - -This pattern provides an easy to decouple many components working together. -It is a good alternative over Observer IF you have a "central intelligence", -like a controller (but not in the sense of the MVC). - -All components (called Colleague) are only coupled to the MediatorInterface and -it is a good thing because in OOP, one good friend is better than many. This -is the key-feature of this pattern. - -## UML Diagram - -![Alt Mediator UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Behavioral/Mediator/index.rst b/Behavioral/Mediator/README.rst similarity index 100% rename from Behavioral/Mediator/index.rst rename to Behavioral/Mediator/README.rst diff --git a/Behavioral/Memento/README.md b/Behavioral/Memento/README.md deleted file mode 100644 index 4e3294e..0000000 --- a/Behavioral/Memento/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Memento - -## Purpose - -Provide the ability to restore an object to its previous state (undo via rollback). - -The memento pattern is implemented with three objects: the originator, a caretaker and a memento. -The originator is some object that has an internal state. -The caretaker is going to do something to the originator, but wants to be able to undo the change. -The caretaker first asks the originator for a memento object. Then it does whatever operation (or sequence of operations) it was going to do. -To roll back to the state before the operations, it returns the memento object to the originator. -The memento object itself is an opaque object (one which the caretaker cannot, or should not, change). -When using this pattern, care should be taken if the originator may change other objects or resources - the memento pattern operates on a single object. - -## Examples - -* The seed of a pseudorandom number generator -* The state in a finite state machine - -## UML Diagram - -![Alt Momento UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Behavioral/Memento/index.rst b/Behavioral/Memento/README.rst similarity index 100% rename from Behavioral/Memento/index.rst rename to Behavioral/Memento/README.rst diff --git a/Behavioral/NullObject/README.md b/Behavioral/NullObject/README.md deleted file mode 100644 index 108b07c..0000000 --- a/Behavioral/NullObject/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Null Object - -## Purpose - -NullObject is not a GoF design pattern but a schema which appears frequently enough to be considered a pattern. It has the following benefits: - -* Client code is simplified -* Reduces the chance of null pointer exceptions -* Fewer conditionals require less test cases - -Methods that return an object or null should instead return an object or `NullObject`. `NullObject`s simplify boilerplate code such as `if (!is_null($obj)) { $obj->callSomething(); }` to just `$obj->callSomething();` by eliminating the conditional check in client code. - -## Examples - -* Symfony2: null logger of profiler -* Symfony2: null output in Symfony/Console -* null handler in a Chain of Responsibilities pattern -* null command in a Command pattern - -## UML Diagram - -![Alt NullObject UML Diagram](uml/uml.png) diff --git a/Behavioral/NullObject/index.rst b/Behavioral/NullObject/README.rst similarity index 100% rename from Behavioral/NullObject/index.rst rename to Behavioral/NullObject/README.rst diff --git a/Behavioral/Observer/README.md b/Behavioral/Observer/README.md deleted file mode 100644 index ccaeaca..0000000 --- a/Behavioral/Observer/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Observer - -## Purpose - -To implement a publish/subscribe behaviour to an object, whenever a "Subject" object changes it's state, the attached -"Observers" will be notified. It is used to shorten the amount of coupled objects and uses loose coupling instead. - -## Examples - -* a message queue system is observed to show the progress of a job in a GUI - -## Note - -PHP already defines two interfaces that can help to implement this pattern: SplObserver and SplSubject. - -## UML Diagram - -![Alt Observer UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Behavioral/Observer/index.rst b/Behavioral/Observer/README.rst similarity index 100% rename from Behavioral/Observer/index.rst rename to Behavioral/Observer/README.rst diff --git a/Behavioral/index.rst b/Behavioral/README.rst similarity index 54% rename from Behavioral/index.rst rename to Behavioral/README.rst index 3513745..afd911c 100644 --- a/Behavioral/index.rst +++ b/Behavioral/README.rst @@ -9,15 +9,15 @@ carrying out this communication. .. toctree:: :titlesonly: - ChainOfResponsibilities/index - Command/index - Iterator/index - Mediator/index - Memento/index - NullObject/index - Observer/index - Specification/index - State/index - Strategy/index - TemplateMethod/index - Visitor/index \ No newline at end of file + ChainOfResponsibilities/README + Command/README + Iterator/README + Mediator/README + Memento/README + NullObject/README + Observer/README + Specification/README + State/README + Strategy/README + TemplateMethod/README + Visitor/README \ No newline at end of file diff --git a/Behavioral/Specification/README.md b/Behavioral/Specification/README.md deleted file mode 100644 index 1f55b3b..0000000 --- a/Behavioral/Specification/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Specification - -## Purpose - -Builds a clear specification of business rules, where objects can be checked against. The composite specification class has -one method called `isSatisfiedBy` that returns either true or false depending on whether the given object satisfies the specification. - -## UML Diagram - -![Alt Specification UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Behavioral/Specification/index.rst b/Behavioral/Specification/README.rst similarity index 100% rename from Behavioral/Specification/index.rst rename to Behavioral/Specification/README.rst diff --git a/Behavioral/State/README.md b/Behavioral/State/README.md deleted file mode 100644 index 71aff0f..0000000 --- a/Behavioral/State/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# State - -## Purpose - -Encapsulate varying behavior for the same routine based on an object's state. This can be a cleaner way for an object to change its behavior at runtime without resorting to large monolithic conditional statements. - -## UML Diagram - -![Alt State UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Behavioral/State/index.rst b/Behavioral/State/README.rst similarity index 100% rename from Behavioral/State/index.rst rename to Behavioral/State/README.rst diff --git a/Behavioral/Strategy/README.md b/Behavioral/Strategy/README.md deleted file mode 100644 index 9813487..0000000 --- a/Behavioral/Strategy/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Strategy - -## Terminology: - -* Context -* Strategy -* Concrete Strategy - -## Purpose - -To separate strategies and to enable fast switching between them. Also this pattern is a good alternative to inheritance (instead of having an abstract class that is extended). - -## Examples - -* sorting a list of objects, one strategy by date, the other by id -* simplify unit testing: e.g. switching between file and in-memory storage - -## UML Diagram - -![Alt Strategy UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Behavioral/Strategy/index.rst b/Behavioral/Strategy/README.rst similarity index 100% rename from Behavioral/Strategy/index.rst rename to Behavioral/Strategy/README.rst diff --git a/Behavioral/TemplateMethod/README.md b/Behavioral/TemplateMethod/README.md deleted file mode 100644 index c01c00c..0000000 --- a/Behavioral/TemplateMethod/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Template Method - -## Purpose - -Template Method is a behavioral design pattern. - -Perhaps you have encountered it many times already. The idea is to let subclasses of this abstract template "finish" the behavior of an algorithm. - -A.k.a the "Hollywood principle": "Don't call us, we call you." This class is not called by subclasses but the inverse. -How? With abstraction of course. - -In other words, this is a skeleton of algorithm, well-suited for framework libraries. The user has just to implement one method and the superclass do the job. - -It is an easy way to decouple concrete classes and reduce copy-paste, that's why you'll find it everywhere. - -## UML Diagram - -![Alt TemplateMethod UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Behavioral/TemplateMethod/index.rst b/Behavioral/TemplateMethod/README.rst similarity index 100% rename from Behavioral/TemplateMethod/index.rst rename to Behavioral/TemplateMethod/README.rst diff --git a/Behavioral/Visitor/README.md b/Behavioral/Visitor/README.md deleted file mode 100644 index 3db1d9c..0000000 --- a/Behavioral/Visitor/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Visitor - -## Purpose - -The Visitor Pattern lets you outsource operations on objects to other objects. The main reason to do this is to keep a separation of concerns. -But classes have to define a contract to allow visitors (the `Role::accept` method in the example). - -The contract is an abstract class but you can have also a clean interface. In that case, each Visitor has to choose itself which method to invoke on the visitor. - -## UML Diagram - -![Alt Visitor UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Behavioral/Visitor/index.rst b/Behavioral/Visitor/README.rst similarity index 100% rename from Behavioral/Visitor/index.rst rename to Behavioral/Visitor/README.rst diff --git a/Creational/AbstractFactory/README.md b/Creational/AbstractFactory/README.md deleted file mode 100644 index 34d457d..0000000 --- a/Creational/AbstractFactory/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Abstract Factory - -## Purpose - -To create series of related or dependent objects without specifying their concrete classes. -Usually the created classes all implement the same interface. The client of the abstract factory does not care about how these objects are created, he just knows how they go together. - -## UML Diagram - -![Alt AbstractFactory UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Creational/AbstractFactory/index.rst b/Creational/AbstractFactory/README.rst similarity index 100% rename from Creational/AbstractFactory/index.rst rename to Creational/AbstractFactory/README.rst diff --git a/Creational/Builder/Parts/README.md b/Creational/Builder/Parts/README.md deleted file mode 100644 index 9e802c8..0000000 --- a/Creational/Builder/Parts/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# - -# Purpose - - - -# Examples - -* - diff --git a/Creational/Builder/README.md b/Creational/Builder/README.md deleted file mode 100644 index 573816a..0000000 --- a/Creational/Builder/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Builder - -## Purpose - -Builder is an interface that build parts of a complex object. - -Sometimes, if the builder has a better knowledge of what it builds, this interface could be an abstract class with default methods (aka adapter). - -If you have a complex inheritance tree for objects, it is logical to have a complex inheritance tree for builders too. - -Note: Builders have often a fluent interface, see the mock builder of PHPUnit for example. - -## Examples - -* PHPUnit: Mock Builder - -## UML Diagram - -![Alt Builder UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Creational/Builder/index.rst b/Creational/Builder/README.rst similarity index 100% rename from Creational/Builder/index.rst rename to Creational/Builder/README.rst diff --git a/Creational/FactoryMethod/README.md b/Creational/FactoryMethod/README.md deleted file mode 100644 index ae4cfb6..0000000 --- a/Creational/FactoryMethod/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Factory Method - -## Purpose - -The good point over the SimpleFactory is you can subclass it to implement different ways to create objects - -For simple case, this abstract class could be just an interface - -This pattern is a "real" Design Pattern because it achieves the "Dependency Inversion Principle" a.k.a the "D" in S.O.L.I.D principles. - -It means the FactoryMethod class depends on abstractions, not concrete classes. This is the real trick compared to SimpleFactory or StaticFactory. - -## UML Diagram - -![Alt FactoryMethod UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Creational/FactoryMethod/index.rst b/Creational/FactoryMethod/README.rst similarity index 100% rename from Creational/FactoryMethod/index.rst rename to Creational/FactoryMethod/README.rst diff --git a/Creational/Multiton/README.md b/Creational/Multiton/README.md deleted file mode 100644 index 26c9a38..0000000 --- a/Creational/Multiton/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Multiton - -**THIS IS CONSIDERED TO BE AN ANTI-PATTERN! FOR BETTER TESTABILITY AND MAINTAINABILITY USE DEPENDENCY INJECTION!** - -# Purpose - -To have only a list of named instances that are used, like a singleton but with n instances. - -# Examples - -* 2 DB Connectors, e.g. one for MySQL, the other for SQLite -* multiple Loggers (one for debug messages, one for errors) - -## UML Diagram - -![Alt Multiton UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Creational/Multiton/index.rst b/Creational/Multiton/README.rst similarity index 100% rename from Creational/Multiton/index.rst rename to Creational/Multiton/README.rst diff --git a/Creational/Pool/README.md b/Creational/Pool/README.md deleted file mode 100644 index 7229a5a..0000000 --- a/Creational/Pool/README.md +++ /dev/null @@ -1,12 +0,0 @@ -Pool -==== - -The **object pool pattern** is a software creational design pattern that uses a set of initialized objects kept ready to use – a "pool" – rather than allocating and destroying them on demand. A client of the pool will request an object from the pool and perform operations on the returned object. When the client has finished, it returns the object, which is a specific type of factory object, to the pool rather than destroying it. - -Object pooling can offer a significant performance boost in situations where the cost of initializing a class instance is high, the rate of instantiation of a class is high, and the number of instances in use at any one time is low. The pooled object is obtained in predictable time when creation of the new objects (especially over network) may take variable time. - -However these benefits are mostly true for objects that are expensive with respect to time, such as database connections, socket connections, threads and large graphic objects like fonts or bitmaps. In certain situations, simple object pooling (that hold no external resources, but only occupy memory) may not be efficient and could decrease performance. - -## UML Diagram - -![Alt Pool UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Creational/Pool/index.rst b/Creational/Pool/README.rst similarity index 100% rename from Creational/Pool/index.rst rename to Creational/Pool/README.rst diff --git a/Creational/Prototype/README.md b/Creational/Prototype/README.md deleted file mode 100644 index 6244e8a..0000000 --- a/Creational/Prototype/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Prototype - -## Purpose - -To avoid the cost of creating objects the standard way (new Foo()) and instead create a prototype and clone it. - -## Examples - -* Large amounts of data (e.g. create 1,000,000 rows in a database at once via a ORM). - -## UML Diagram - -![Alt Prototype UML Diagram](uml/uml.png) diff --git a/Creational/Prototype/index.rst b/Creational/Prototype/README.rst similarity index 100% rename from Creational/Prototype/index.rst rename to Creational/Prototype/README.rst diff --git a/Creational/index.rst b/Creational/README.rst similarity index 69% rename from Creational/index.rst rename to Creational/README.rst index 6d041a7..72eb5d3 100644 --- a/Creational/index.rst +++ b/Creational/README.rst @@ -11,12 +11,12 @@ this object creation. .. toctree:: :titlesonly: - AbstractFactory/index - Builder/index - FactoryMethod/index - Multiton/index - Pool/index - Prototype/index - SimpleFactory/index - Singleton/index - StaticFactory/index \ No newline at end of file + AbstractFactory/README + Builder/README + FactoryMethod/README + Multiton/README + Pool/README + Prototype/README + SimpleFactory/README + Singleton/README + StaticFactory/README \ No newline at end of file diff --git a/Creational/SimpleFactory/README.md b/Creational/SimpleFactory/README.md deleted file mode 100644 index fedaa9d..0000000 --- a/Creational/SimpleFactory/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Simple Factory - -## Purpose - -ConcreteFactory is a simple factory pattern. - -It differs from the static factory because it is NOT static and as you know: static => global => evil! - -Therefore, you can have multiple factories, differently parametrized, you can subclass it and you can mock-up it. - -## UML Diagram - -![Alt SimpleFactory UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Creational/SimpleFactory/index.rst b/Creational/SimpleFactory/README.rst similarity index 100% rename from Creational/SimpleFactory/index.rst rename to Creational/SimpleFactory/README.rst diff --git a/Creational/Singleton/README.md b/Creational/Singleton/README.md deleted file mode 100644 index b90fcdc..0000000 --- a/Creational/Singleton/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Singleton - -**THIS IS CONSIDERED TO BE AN ANTI-PATTERN! FOR BETTER TESTABILITY AND MAINTAINABILITY USE DEPENDENCY INJECTION!** - -## Purpose - -To have only one instance of this object in the application that will handle all calls. - -## Examples - -* DB Connector -* Logger (may also be a Multiton if there are many log files for several purposes) -* Lock file for the application (there is only one in the filesystem ...) - -## UML Diagram - -![Alt Singleton UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Creational/Singleton/index.rst b/Creational/Singleton/README.rst similarity index 100% rename from Creational/Singleton/index.rst rename to Creational/Singleton/README.rst diff --git a/Creational/StaticFactory/README.md b/Creational/StaticFactory/README.md deleted file mode 100644 index f5e2710..0000000 --- a/Creational/StaticFactory/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Static Factory - -## Purpose - -Similar to the AbstractFactory, this pattern is used to create series of related or dependent objects. -The difference between this and the abstract factory pattern is that the static factory pattern uses just one static -method to create all types of objects it can create. It is usually named `factory` or `build`. - -## Examples - -* Zend Framework: `Zend_Cache_Backend` or `_Frontend` use a factory method create cache backends or frontends - -## UML Diagram - -![Alt StaticFactory UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Creational/StaticFactory/index.rst b/Creational/StaticFactory/README.rst similarity index 100% rename from Creational/StaticFactory/index.rst rename to Creational/StaticFactory/README.rst diff --git a/More/Delegation/README.md b/More/Delegation/README.md deleted file mode 100644 index c51128c..0000000 --- a/More/Delegation/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Delegation - -## Purpose - -... - -## Examples - -... - -## UML Diagram - -![Alt Delegation UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/More/Delegation/index.rst b/More/Delegation/README.rst similarity index 100% rename from More/Delegation/index.rst rename to More/Delegation/README.rst diff --git a/More/README.rst b/More/README.rst new file mode 100644 index 0000000..b0550f2 --- /dev/null +++ b/More/README.rst @@ -0,0 +1,9 @@ +More +==== + +.. toctree:: + :titlesonly: + + Delegation/README + ServiceLocator/README + Repository/README \ No newline at end of file diff --git a/More/Repository/README.md b/More/Repository/README.md deleted file mode 100644 index 0e2b188..0000000 --- a/More/Repository/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Repository - -## Purpose - -Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects. -Repository encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer. -Repository also supports the objective of achieving a clean separation and one-way dependency between the domain and data mapping layers. - -## Examples - -* Doctrine 2 ORM: there is Repository that mediates between Entity and DBAL and contains methods to retrieve objects -* Laravel Framework - -## UML Diagram - -![Alt Repository UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/More/Repository/index.rst b/More/Repository/README.rst similarity index 100% rename from More/Repository/index.rst rename to More/Repository/README.rst diff --git a/More/ServiceLocator/README.md b/More/ServiceLocator/README.md deleted file mode 100644 index cdee496..0000000 --- a/More/ServiceLocator/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Service Locator - -## Purpose - -To implement a loosely coupled architecture in order to get better testable, maintainable and extendable code. -DI pattern and Service Locator pattern are an implementation of the Inverse of Control pattern. - -## Usage - -With `ServiceLocator` you can register a service for a given interface. By using the interface you can retrieve the service -and use it in the classes of the application without knowing its implementation. You can configure and inject the -Service Locator object on bootstrap. - -## Examples - -* Zend Framework 2 uses Service Locator to create and share services used in the framework(i.e. EventManager, ModuleManager, all custom user services provided by modules, etc...) - -## UML Diagram - -![Alt ServiceLocator UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/More/ServiceLocator/index.rst b/More/ServiceLocator/README.rst similarity index 100% rename from More/ServiceLocator/index.rst rename to More/ServiceLocator/README.rst diff --git a/More/index.rst b/More/index.rst deleted file mode 100644 index 6ba85d3..0000000 --- a/More/index.rst +++ /dev/null @@ -1,9 +0,0 @@ -More -==== - -.. toctree:: - :titlesonly: - - Delegation/index - ServiceLocator/index - Repository/index \ No newline at end of file diff --git a/index.rst b/README.rst similarity index 97% rename from index.rst rename to README.rst index fbda3c9..cf83385 100644 --- a/index.rst +++ b/README.rst @@ -26,10 +26,10 @@ Please click on **the title of every pattern's page** for a full explanation of :titlesonly: :numbered: - Creational/index - Structural/index - Behavioral/index - More/index + Creational/README + Structural/README + Behavioral/README + More/README Contribute ---------- diff --git a/Structural/Adapter/README.md b/Structural/Adapter/README.md deleted file mode 100644 index d2390df..0000000 --- a/Structural/Adapter/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Adapter / Wrapper - -## Purpose - -To translate one interface for a class into a compatible interface. An adapter allows classes to work together that normally could not because of incompatible interfaces by providing it's interface to clients while using the original interface. - -## Examples - -* DB Client libraries adapter -* using multiple different webservices and adapters normalize data so that the outcome is the same for all - -## UML Diagram - -![Alt Adapter UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Structural/Adapter/index.rst b/Structural/Adapter/README.rst similarity index 100% rename from Structural/Adapter/index.rst rename to Structural/Adapter/README.rst diff --git a/Structural/Bridge/README.md b/Structural/Bridge/README.md deleted file mode 100644 index b4bf4fd..0000000 --- a/Structural/Bridge/README.md +++ /dev/null @@ -1,12 +0,0 @@ -## Purpose - -Decouple an abstraction from its implementation so that the two can vary -independently. (http://en.wikipedia.org/wiki/Bridge_pattern) - -#### Sample: - -* [Symfony DoctrineBridge](https://github.com/symfony/DoctrineBridge) - -## UML Diagram - -![Alt Bridge UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Structural/Bridge/index.rst b/Structural/Bridge/README.rst similarity index 100% rename from Structural/Bridge/index.rst rename to Structural/Bridge/README.rst diff --git a/Structural/Composite/README.md b/Structural/Composite/README.md deleted file mode 100755 index f0ca01c..0000000 --- a/Structural/Composite/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Composite - -# Purpose - -To treat a group of objects the same way as a single instance of the object. - -# Examples - -* a form class instance handles all its form elements like a single instance of the form, when `render()` is called, it - subsequently runs through all its child elements and calls `render()` on them -* `Zend_Config`: a tree of configuration options, each one is a `Zend_Config` object itself - -## UML Diagram - -![Alt Composite UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Structural/Composite/index.rst b/Structural/Composite/README.rst similarity index 100% rename from Structural/Composite/index.rst rename to Structural/Composite/README.rst diff --git a/Structural/DataMapper/README.md b/Structural/DataMapper/README.md deleted file mode 100644 index 70efe20..0000000 --- a/Structural/DataMapper/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Data Mapper - -## Purpose - -A Data Mapper, is a Data Access Layer that performs bidirectional transfer of -data between a persistent data store (often a relational database) and an in -memory data representation (the domain layer). The goal of the pattern is to -keep the in memory representation and the persistent data store independent of -each other and the data mapper itself. The layer is composed of one or more -mappers (or Data Access Objects), performing the data transfer. Mapper -implementations vary in scope. Generic mappers will handle many different domain -entity types, dedicated mappers will handle one or a few. - -The key point of this pattern is, unlike Active Record pattern, the data model follows Single Responsibility Principle. - -## Examples - -* DB Object Relational Mapper (ORM) : Doctrine2 uses DAO named as "EntityRepository" - -## UML Diagram - -![Alt DataMapper UML Diagram](uml/uml.png) diff --git a/Structural/DataMapper/index.rst b/Structural/DataMapper/README.rst similarity index 100% rename from Structural/DataMapper/index.rst rename to Structural/DataMapper/README.rst diff --git a/Structural/Decorator/README.md b/Structural/Decorator/README.md deleted file mode 100644 index 4eedd89..0000000 --- a/Structural/Decorator/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Decorator - -## Purpose - -To dynamically add new functionality to class instances. - -## Examples - -* Zend Framework: decorators for `Zend_Form_Element` instances -* Web Service Layer: Decorators JSON and XML for a REST service (in this case, only one of these should be allowed of course) - -## UML Diagram - -![Alt Decorator UML Diagram](uml/uml.png) diff --git a/Structural/Decorator/index.rst b/Structural/Decorator/README.rst similarity index 100% rename from Structural/Decorator/index.rst rename to Structural/Decorator/README.rst diff --git a/Structural/DependencyInjection/README.md b/Structural/DependencyInjection/README.md deleted file mode 100644 index 185a550..0000000 --- a/Structural/DependencyInjection/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Dependency Injection - -## Purpose - -To implement a loosely coupled architecture in order to get better testable, maintainable and extendable code. - -## Usage - -Configuration gets injected and `Connection` will get all that it needs from `$config`. Without DI, the configuration would be created directly in `Connection`, which is not very good for testing and extending `Connection`. - -Notice we are following Inversion of control principle in `Connection` by asking `$config` to implement `Parameters` interface. This decouples our components. We don't care where the source of information comes from, we only care that `$config` has certain methods to retrieve that information. Read more about Inversion of control [here](http://en.wikipedia.org/wiki/Inversion_of_control). - -## Examples - -* The Doctrine2 ORM uses dependency injection e.g. for configuration that is injected into a `Connection` object. For testing purposes, one can easily create a mock object of the configuration and inject that into the `Connection` object -* Symfony and Zend Framework 2 already have containers for DI that create objects via a configuration array and inject them where needed (i.e. in Controllers) - -## UML Diagram - -![Alt DependencyInjection UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Structural/DependencyInjection/index.rst b/Structural/DependencyInjection/README.rst similarity index 100% rename from Structural/DependencyInjection/index.rst rename to Structural/DependencyInjection/README.rst diff --git a/Structural/Facade/README.md b/Structural/Facade/README.md deleted file mode 100644 index 4a9019c..0000000 --- a/Structural/Facade/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Facade - -## Purpose - -The primary goal of a Facade Pattern is not to avoid you to read the manual of a complex API. It's only a side-effect. -The first goal is to reduce coupling and follow the Law of Demeter. - -A Facade is meant to decouple a client and a sub-system by embedding many (but sometimes just one) interface, and of course to reduce complexity. - -* A facade does not forbid you the access to the sub-system -* You can (you should) have multiple facades for one sub-system - -That's why a good facade has no `new` in it. If there are multiple creations for each method, it is not a Facade, it's a Builder or a -[Abstract|Static|Simple] Factory [Method]. - -The best facade has no `new` and a constructor with interface-type-hinted parameters. -If you need creation of new instances, use a Factory as argument. - -## UML Diagram - -![Alt Facade UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Structural/Facade/index.rst b/Structural/Facade/README.rst similarity index 100% rename from Structural/Facade/index.rst rename to Structural/Facade/README.rst diff --git a/Structural/FluentInterface/README.md b/Structural/FluentInterface/README.md deleted file mode 100644 index 2ed92d3..0000000 --- a/Structural/FluentInterface/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Fluent Interface - -## Purpose - -To write code that is easy readable just like sentences in a natural language (like English). - -## Examples - -* Doctrine2's QueryBuilder works something like that example class below -* PHPUnit uses fluent interfaces to build mock objects -* Yii Framework: CDbCommand and CActiveRecord use this pattern, too - -## UML Diagram - -![Alt FluentInterface UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Structural/FluentInterface/index.rst b/Structural/FluentInterface/README.rst similarity index 100% rename from Structural/FluentInterface/index.rst rename to Structural/FluentInterface/README.rst diff --git a/Structural/Proxy/README.md b/Structural/Proxy/README.md deleted file mode 100644 index b4c0e39..0000000 --- a/Structural/Proxy/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Proxy - -## Purpose - -To interface to anything that is expensive or impossible to duplicate. - -## Examples - -* Doctrine2 uses proxies to implement framework magic (e.g. lazy initialization) in them, while the user still works with his own entity classes and will never use nor touch the proxies - -## UML Diagram - -![Alt Proxy UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Structural/Proxy/index.rst b/Structural/Proxy/README.rst similarity index 100% rename from Structural/Proxy/index.rst rename to Structural/Proxy/README.rst diff --git a/Structural/index.rst b/Structural/README.rst similarity index 51% rename from Structural/index.rst rename to Structural/README.rst index 6505413..47b6650 100644 --- a/Structural/index.rst +++ b/Structural/README.rst @@ -8,13 +8,13 @@ relationships between entities. .. toctree:: :titlesonly: - Adapter/index - Bridge/index - Composite/index - DataMapper/index - Decorator/index - DependencyInjection/index - Facade/index - FluentInterface/index - Proxy/index - Registry/index \ No newline at end of file + Adapter/README + Bridge/README + Composite/README + DataMapper/README + Decorator/README + DependencyInjection/README + Facade/README + FluentInterface/README + Proxy/README + Registry/README \ No newline at end of file diff --git a/Structural/Registry/README.md b/Structural/Registry/README.md deleted file mode 100644 index 840d2cf..0000000 --- a/Structural/Registry/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Registry - -## Purpose - -To implement a central storage for objects often used throughout the application, is typically implemented using -an abstract class with only static methods (or using the Singleton pattern) - -## Examples - -* Zend Framework: `Zend_Registry` holds the application's logger object, front controller etc. -* Yii Framework: `CWebApplication` holds all the application components, such as `CWebUser`, `CUrlManager`, etc. - -## UML Diagram - -![Alt Registry UML Diagram](uml/uml.png) \ No newline at end of file diff --git a/Structural/Registry/index.rst b/Structural/Registry/README.rst similarity index 100% rename from Structural/Registry/index.rst rename to Structural/Registry/README.rst diff --git a/conf.py b/conf.py index 5ae01ae..6df45f4 100644 --- a/conf.py +++ b/conf.py @@ -43,7 +43,7 @@ source_suffix = '.rst' #source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = 'README' # General information about the project. project = u'DesignPatternsPHP' diff --git a/read-the-docs.sh b/read-the-docs.sh deleted file mode 100755 index e868670..0000000 --- a/read-the-docs.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash - -# Step 1 use pandoc to convert README.md to index.rst -find . -type f -name "README.md" \ - -execdir pandoc -f markdown -t rst -s -o "index.rst" {} \; \ -# -delete - -# Step 2 move uml/* of every pattern to images/path_to_pattern/uml/* -#find . -type d -name "uml" \ -# -exec bash -c 'mkdir -p images/${1:2}' funcname {} \; \ -# -exec bash -c 'mv ${1}/* images/${1:2}' funcname {} \; \ -# -delete - -# Step 3 change the content of index.rst -# embed php files in index.rst -for INDEX in $(find . -type f -name "index.rst") -do - # fix figure to image, add align center - sed -i "s|.. figure::|.. image::|g" ${INDEX} - sed -i "/:alt:/{n;d}" ${INDEX} - sed -i "s| Alt.*| :align: center|" ${INDEX} - - BASEDIR=$(dirname ${INDEX}) - - # fix image path uml/uml.png to images/path_to_pattern/uml/uml.png - # sed -i "s|uml/uml.png|/images/${BASEDIR:2}/uml/uml.png|g" ${INDEX} - - # embed pattern files - echo -e "\nCode\n----\n" >> ${INDEX} - echo -e "You can also find these code on \`GitHub\`_\n" >> ${INDEX} - - for PHPFILE in $(find ${BASEDIR} -maxdepth 1 -type f -name "*.php") - do - echo -e "$(basename ${PHPFILE})\n" >> ${INDEX} - echo -e ".. literalinclude:: $(basename ${PHPFILE})\n :language: php\n :linenos:\n" >> ${INDEX} - done - - # embed test files - echo -e "Test\n----\n" >> ${INDEX} - - for TESTFILE in $(find ${BASEDIR}/Tests -maxdepth 1 -type f -name "*.php") - do - echo -e "Tests/$(basename ${TESTFILE})\n" >> ${INDEX} - echo -e ".. literalinclude:: Tests/$(basename ${TESTFILE})\n :language: php\n :linenos:\n" >> ${INDEX} - done - - # add link on GitHub of this pattern - echo -e ".. _\`GitHub\`: https://github.com/domnikl/DesignPatternsPHP/tree/master/${BASEDIR:2}" >> ${INDEX} -done - -# Step 4 embed other php files in index.rst -# fix TocTree of projet \ No newline at end of file From 23abee807817c52ad3b8566445f82c442c9d784e Mon Sep 17 00:00:00 2001 From: Faust Date: Tue, 7 Apr 2015 22:00:12 +0200 Subject: [PATCH 12/14] sort php files Creational --- Behavioral/README.rst | 2 +- Creational/AbstractFactory/README.rst | 38 +++++++-------- Creational/Builder/README.rst | 58 +++++++++++------------ Creational/FactoryMethod/README.rst | 22 ++++----- Creational/Pool/README.rst | 12 ++--- Creational/Prototype/README.rst | 14 +++--- Creational/README.rst | 2 +- Creational/SimpleFactory/README.rst | 12 ++--- Creational/Singleton/README.rst | 2 +- More/Delegation/README.rst | 2 +- More/README.rst | 2 +- More/ServiceLocator/README.rst | 2 +- README.rst | 11 +++-- Structural/Adapter/README.rst | 2 +- Structural/Bridge/README.rst | 2 +- Structural/Composite/README.rst | 2 +- Structural/DataMapper/README.rst | 2 +- Structural/Decorator/README.rst | 2 +- Structural/DependencyInjection/README.rst | 2 +- Structural/Facade/README.rst | 2 +- Structural/Proxy/README.rst | 2 +- Structural/README.rst | 2 +- Structural/Registry/README.rst | 2 +- 23 files changed, 100 insertions(+), 99 deletions(-) diff --git a/Behavioral/README.rst b/Behavioral/README.rst index afd911c..646df1f 100644 --- a/Behavioral/README.rst +++ b/Behavioral/README.rst @@ -20,4 +20,4 @@ carrying out this communication. State/README Strategy/README TemplateMethod/README - Visitor/README \ No newline at end of file + Visitor/README diff --git a/Creational/AbstractFactory/README.rst b/Creational/AbstractFactory/README.rst index 9942e4c..3e6d7ef 100644 --- a/Creational/AbstractFactory/README.rst +++ b/Creational/AbstractFactory/README.rst @@ -21,9 +21,9 @@ Code You can also find these code on `GitHub`_ -Text.php +AbstractFactory.php -.. literalinclude:: Text.php +.. literalinclude:: AbstractFactory.php :language: php :linenos: @@ -33,9 +33,9 @@ JsonFactory.php :language: php :linenos: -AbstractFactory.php +HtmlFactory.php -.. literalinclude:: AbstractFactory.php +.. literalinclude:: HtmlFactory.php :language: php :linenos: @@ -45,27 +45,15 @@ MediaInterface.php :language: php :linenos: -HtmlFactory.php - -.. literalinclude:: HtmlFactory.php - :language: php - :linenos: - Picture.php .. literalinclude:: Picture.php :language: php :linenos: -Html/Picture.php +Text.php -.. literalinclude:: Html/Picture.php - :language: php - :linenos: - -Html/Text.php - -.. literalinclude:: Html/Text.php +.. literalinclude:: Text.php :language: php :linenos: @@ -81,6 +69,18 @@ Json/Text.php :language: php :linenos: +Html/Picture.php + +.. literalinclude:: Html/Picture.php + :language: php + :linenos: + +Html/Text.php + +.. literalinclude:: Html/Text.php + :language: php + :linenos: + Test ---- @@ -91,4 +91,4 @@ Tests/AbstractFactoryTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/AbstractFactory -.. _`Abstract Factory`: http://en.wikipedia.org/wiki/Abstract_factory_pattern \ No newline at end of file +.. _`Abstract Factory`: http://en.wikipedia.org/wiki/Abstract_factory_pattern diff --git a/Creational/Builder/README.rst b/Creational/Builder/README.rst index 03a1030..85b38ea 100644 --- a/Creational/Builder/README.rst +++ b/Creational/Builder/README.rst @@ -32,27 +32,51 @@ Code You can also find these code on `GitHub`_ +Director.php + +.. literalinclude:: Director.php + :language: php + :linenos: + BuilderInterface.php .. literalinclude:: BuilderInterface.php :language: php :linenos: +BikeBuilder.php + +.. literalinclude:: BikeBuilder.php + :language: php + :linenos: + CarBuilder.php .. literalinclude:: CarBuilder.php :language: php :linenos: -Director.php +Parts/Vehicle.php -.. literalinclude:: Director.php +.. literalinclude:: Parts/Vehicle.php :language: php :linenos: -BikeBuilder.php +Parts/Bike.php -.. literalinclude:: BikeBuilder.php +.. literalinclude:: Parts/Bike.php + :language: php + :linenos: + +Parts/Car.php + +.. literalinclude:: Parts/Car.php + :language: php + :linenos: + +Parts/Engine.php + +.. literalinclude:: Parts/Engine.php :language: php :linenos: @@ -68,30 +92,6 @@ Parts/Door.php :language: php :linenos: -Parts/Car.php - -.. literalinclude:: Parts/Car.php - :language: php - :linenos: - -Parts/Bike.php - -.. literalinclude:: Parts/Bike.php - :language: php - :linenos: - -Parts/Vehicle.php - -.. literalinclude:: Parts/Vehicle.php - :language: php - :linenos: - -Parts/Engine.php - -.. literalinclude:: Parts/Engine.php - :language: php - :linenos: - Test ---- @@ -102,4 +102,4 @@ Tests/DirectorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Builder -.. _`Builder`: http://en.wikipedia.org/wiki/Builder_pattern \ No newline at end of file +.. _`Builder`: http://en.wikipedia.org/wiki/Builder_pattern diff --git a/Creational/FactoryMethod/README.rst b/Creational/FactoryMethod/README.rst index 7552078..6ec224e 100644 --- a/Creational/FactoryMethod/README.rst +++ b/Creational/FactoryMethod/README.rst @@ -28,15 +28,9 @@ Code You can also find these code on `GitHub`_ -Porsche.php +FactoryMethod.php -.. literalinclude:: Porsche.php - :language: php - :linenos: - -GermanFactory.php - -.. literalinclude:: GermanFactory.php +.. literalinclude:: FactoryMethod.php :language: php :linenos: @@ -46,15 +40,21 @@ ItalianFactory.php :language: php :linenos: +GermanFactory.php + +.. literalinclude:: GermanFactory.php + :language: php + :linenos: + VehicleInterface.php .. literalinclude:: VehicleInterface.php :language: php :linenos: -FactoryMethod.php +Porsche.php -.. literalinclude:: FactoryMethod.php +.. literalinclude:: Porsche.php :language: php :linenos: @@ -80,4 +80,4 @@ Tests/FactoryMethodTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/FactoryMethod -.. _`Factory Method`: http://en.wikipedia.org/wiki/Factory_method_pattern \ No newline at end of file +.. _`Factory Method`: http://en.wikipedia.org/wiki/Factory_method_pattern diff --git a/Creational/Pool/README.rst b/Creational/Pool/README.rst index 6912c72..260d3b0 100644 --- a/Creational/Pool/README.rst +++ b/Creational/Pool/README.rst @@ -54,17 +54,17 @@ Worker.php Test ---- -Tests/TestWorker.php - -.. literalinclude:: Tests/TestWorker.php - :language: php - :linenos: - Tests/PoolTest.php .. literalinclude:: Tests/PoolTest.php :language: php :linenos: +Tests/TestWorker.php + +.. literalinclude:: Tests/TestWorker.php + :language: php + :linenos: + .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Pool .. _`Pool`: http://en.wikipedia.org/wiki/Object_pool_pattern diff --git a/Creational/Prototype/README.rst b/Creational/Prototype/README.rst index 5485edd..64c558d 100644 --- a/Creational/Prototype/README.rst +++ b/Creational/Prototype/README.rst @@ -25,6 +25,12 @@ Code You can also find these code on `GitHub`_ +index.php + +.. literalinclude:: index.php + :language: php + :linenos: + BookPrototype.php .. literalinclude:: BookPrototype.php @@ -37,12 +43,6 @@ BarBookPrototype.php :language: php :linenos: -index.php - -.. literalinclude:: index.php - :language: php - :linenos: - FooBookPrototype.php .. literalinclude:: FooBookPrototype.php @@ -53,4 +53,4 @@ Test ---- .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Prototype -.. _`Prototype`: http://en.wikipedia.org/wiki/Prototype_pattern \ No newline at end of file +.. _`Prototype`: http://en.wikipedia.org/wiki/Prototype_pattern diff --git a/Creational/README.rst b/Creational/README.rst index 72eb5d3..d908772 100644 --- a/Creational/README.rst +++ b/Creational/README.rst @@ -19,4 +19,4 @@ this object creation. Prototype/README SimpleFactory/README Singleton/README - StaticFactory/README \ No newline at end of file + StaticFactory/README diff --git a/Creational/SimpleFactory/README.rst b/Creational/SimpleFactory/README.rst index ff55711..364947f 100644 --- a/Creational/SimpleFactory/README.rst +++ b/Creational/SimpleFactory/README.rst @@ -36,18 +36,18 @@ VehicleInterface.php :language: php :linenos: -Scooter.php - -.. literalinclude:: Scooter.php - :language: php - :linenos: - Bicycle.php .. literalinclude:: Bicycle.php :language: php :linenos: +Scooter.php + +.. literalinclude:: Scooter.php + :language: php + :linenos: + Test ---- diff --git a/Creational/Singleton/README.rst b/Creational/Singleton/README.rst index 319364e..4ec37ae 100644 --- a/Creational/Singleton/README.rst +++ b/Creational/Singleton/README.rst @@ -47,4 +47,4 @@ Tests/SingletonTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Singleton -.. _`Singleton`: http://en.wikipedia.org/wiki/Singleton_pattern \ No newline at end of file +.. _`Singleton`: http://en.wikipedia.org/wiki/Singleton_pattern diff --git a/More/Delegation/README.rst b/More/Delegation/README.rst index 149cddf..51b05fc 100644 --- a/More/Delegation/README.rst +++ b/More/Delegation/README.rst @@ -51,4 +51,4 @@ Tests/DelegationTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/More/Delegation -.. _`Delegation`: http://en.wikipedia.org/wiki/Delegation_pattern \ No newline at end of file +.. _`Delegation`: http://en.wikipedia.org/wiki/Delegation_pattern diff --git a/More/README.rst b/More/README.rst index b0550f2..dbab1f6 100644 --- a/More/README.rst +++ b/More/README.rst @@ -6,4 +6,4 @@ More Delegation/README ServiceLocator/README - Repository/README \ No newline at end of file + Repository/README diff --git a/More/ServiceLocator/README.rst b/More/ServiceLocator/README.rst index 2972391..f7e69a2 100644 --- a/More/ServiceLocator/README.rst +++ b/More/ServiceLocator/README.rst @@ -81,4 +81,4 @@ Tests/ServiceLocatorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/More/ServiceLocator -.. _`Service Locator`: http://en.wikipedia.org/wiki/Service_locator_pattern \ No newline at end of file +.. _`Service Locator`: http://en.wikipedia.org/wiki/Service_locator_pattern diff --git a/README.rst b/README.rst index cf83385..3db54a9 100644 --- a/README.rst +++ b/README.rst @@ -37,9 +37,7 @@ Contribute Please feel free to fork and extend existing or add your own examples and send a pull request with your changes! To establish a consistent code quality, please check your code using -`PHP\_CodeSniffer `__ -against `PSR2 -standard `__ +`PHP CodeSniffer`_ against `PSR2 standard`_ using ``./vendor/bin/phpcs -p --standard=PSR2 --ignore=vendor .``. License @@ -47,8 +45,7 @@ License (The MIT License) -Copyright (c) 2014 Dominik Liebler and -`contributors `__ +Copyright (c) 2014 `Dominik Liebler`_ and `contributors`_ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -70,3 +67,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. .. _`design patterns`: http://en.wikipedia.org/wiki/Software_design_pattern +.. _`PHP CodeSniffer`: https://github.com/squizlabs/PHP_CodeSniffer +.. _`PSR2 standard`: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md +.. _`Dominik Liebler`: https://github.com/domnikl +.. _`contributors`: https://github.com/domnikl/DesignPatternsPHP/graphs/contributors diff --git a/Structural/Adapter/README.rst b/Structural/Adapter/README.rst index 2aa2ea5..5136d07 100644 --- a/Structural/Adapter/README.rst +++ b/Structural/Adapter/README.rst @@ -68,4 +68,4 @@ Tests/AdapterTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Adapter -.. _`Adapter / Wrapper`: http://en.wikipedia.org/wiki/Adapter_pattern \ No newline at end of file +.. _`Adapter / Wrapper`: http://en.wikipedia.org/wiki/Adapter_pattern diff --git a/Structural/Bridge/README.rst b/Structural/Bridge/README.rst index 62b8056..1de59d8 100644 --- a/Structural/Bridge/README.rst +++ b/Structural/Bridge/README.rst @@ -71,4 +71,4 @@ Tests/BridgeTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Bridge -.. _`Bridge`: http://en.wikipedia.org/wiki/Bridge_pattern \ No newline at end of file +.. _`Bridge`: http://en.wikipedia.org/wiki/Bridge_pattern diff --git a/Structural/Composite/README.rst b/Structural/Composite/README.rst index 6c4af7d..432647e 100644 --- a/Structural/Composite/README.rst +++ b/Structural/Composite/README.rst @@ -62,4 +62,4 @@ Tests/CompositeTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Composite -.. _`Composite`: http://en.wikipedia.org/wiki/Composite_pattern \ No newline at end of file +.. _`Composite`: http://en.wikipedia.org/wiki/Composite_pattern diff --git a/Structural/DataMapper/README.rst b/Structural/DataMapper/README.rst index dcc24de..83ba501 100644 --- a/Structural/DataMapper/README.rst +++ b/Structural/DataMapper/README.rst @@ -57,4 +57,4 @@ Tests/DataMapperTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/DataMapper -.. _`Data Mapper`: http://en.wikipedia.org/wiki/Data_mapper_pattern \ No newline at end of file +.. _`Data Mapper`: http://en.wikipedia.org/wiki/Data_mapper_pattern diff --git a/Structural/Decorator/README.rst b/Structural/Decorator/README.rst index cb9d92b..95d234c 100644 --- a/Structural/Decorator/README.rst +++ b/Structural/Decorator/README.rst @@ -65,4 +65,4 @@ Tests/DecoratorTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Decorator -.. _`Decorator`: http://en.wikipedia.org/wiki/Decorator_pattern \ No newline at end of file +.. _`Decorator`: http://en.wikipedia.org/wiki/Decorator_pattern diff --git a/Structural/DependencyInjection/README.rst b/Structural/DependencyInjection/README.rst index bc7ddff..8200cc1 100644 --- a/Structural/DependencyInjection/README.rst +++ b/Structural/DependencyInjection/README.rst @@ -85,4 +85,4 @@ Tests/config.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/DependencyInjection -.. _`Dependency Injection`: http://en.wikipedia.org/wiki/Dependency_injection \ No newline at end of file +.. _`Dependency Injection`: http://en.wikipedia.org/wiki/Dependency_injection diff --git a/Structural/Facade/README.rst b/Structural/Facade/README.rst index e2baeca..5be63e7 100644 --- a/Structural/Facade/README.rst +++ b/Structural/Facade/README.rst @@ -63,4 +63,4 @@ Tests/FacadeTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Facade -.. _`Facade`: http://en.wikipedia.org/wiki/Facade_pattern \ No newline at end of file +.. _`Facade`: http://en.wikipedia.org/wiki/Facade_pattern diff --git a/Structural/Proxy/README.rst b/Structural/Proxy/README.rst index 4ff818e..f9aa24e 100644 --- a/Structural/Proxy/README.rst +++ b/Structural/Proxy/README.rst @@ -41,4 +41,4 @@ Test ---- .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Proxy -.. _`Proxy`: http://en.wikipedia.org/wiki/Proxy_pattern \ No newline at end of file +.. _`Proxy`: http://en.wikipedia.org/wiki/Proxy_pattern diff --git a/Structural/README.rst b/Structural/README.rst index 47b6650..f717b4a 100644 --- a/Structural/README.rst +++ b/Structural/README.rst @@ -17,4 +17,4 @@ relationships between entities. Facade/README FluentInterface/README Proxy/README - Registry/README \ No newline at end of file + Registry/README diff --git a/Structural/Registry/README.rst b/Structural/Registry/README.rst index f09bd2f..e95ed26 100644 --- a/Structural/Registry/README.rst +++ b/Structural/Registry/README.rst @@ -44,4 +44,4 @@ Tests/RegistryTest.php :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/Structural/Registry -.. _`Registry`: http://en.wikipedia.org/wiki/Service_locator_pattern \ No newline at end of file +.. _`Registry`: http://en.wikipedia.org/wiki/Service_locator_pattern From 321041b2105eea14bfac4aee899afa1cdd510286 Mon Sep 17 00:00:00 2001 From: Faust Date: Wed, 8 Apr 2015 22:42:16 +0200 Subject: [PATCH 13/14] sort php files Structural --- Structural/Adapter/README.rst | 12 ++++++------ Structural/Bridge/README.rst | 24 +++++++++++------------ Structural/DataMapper/README.rst | 12 ++++++------ Structural/Decorator/README.rst | 24 +++++++++++------------ Structural/DependencyInjection/README.rst | 24 +++++++++++------------ Structural/Facade/README.rst | 12 ++++++------ Structural/Proxy/README.rst | 12 ++++++------ conf.py | 6 +++--- 8 files changed, 63 insertions(+), 63 deletions(-) diff --git a/Structural/Adapter/README.rst b/Structural/Adapter/README.rst index 5136d07..dacd97e 100644 --- a/Structural/Adapter/README.rst +++ b/Structural/Adapter/README.rst @@ -34,9 +34,9 @@ PaperBookInterface.php :language: php :linenos: -EBookInterface.php +Book.php -.. literalinclude:: EBookInterface.php +.. literalinclude:: Book.php :language: php :linenos: @@ -46,15 +46,15 @@ EBookAdapter.php :language: php :linenos: -Kindle.php +EBookInterface.php -.. literalinclude:: Kindle.php +.. literalinclude:: EBookInterface.php :language: php :linenos: -Book.php +Kindle.php -.. literalinclude:: Book.php +.. literalinclude:: Kindle.php :language: php :linenos: diff --git a/Structural/Bridge/README.rst b/Structural/Bridge/README.rst index 1de59d8..b92fd1c 100644 --- a/Structural/Bridge/README.rst +++ b/Structural/Bridge/README.rst @@ -25,27 +25,21 @@ Code You can also find these code on `GitHub`_ -Assemble.php - -.. literalinclude:: Assemble.php - :language: php - :linenos: - Workshop.php .. literalinclude:: Workshop.php :language: php :linenos: -Car.php +Assemble.php -.. literalinclude:: Car.php +.. literalinclude:: Assemble.php :language: php :linenos: -Motorcycle.php +Produce.php -.. literalinclude:: Motorcycle.php +.. literalinclude:: Produce.php :language: php :linenos: @@ -55,9 +49,15 @@ Vehicle.php :language: php :linenos: -Produce.php +Motorcycle.php -.. literalinclude:: Produce.php +.. literalinclude:: Motorcycle.php + :language: php + :linenos: + +Car.php + +.. literalinclude:: Car.php :language: php :linenos: diff --git a/Structural/DataMapper/README.rst b/Structural/DataMapper/README.rst index 83ba501..7fca1e9 100644 --- a/Structural/DataMapper/README.rst +++ b/Structural/DataMapper/README.rst @@ -35,18 +35,18 @@ Code You can also find these code on `GitHub`_ -UserMapper.php - -.. literalinclude:: UserMapper.php - :language: php - :linenos: - User.php .. literalinclude:: User.php :language: php :linenos: +UserMapper.php + +.. literalinclude:: UserMapper.php + :language: php + :linenos: + Test ---- diff --git a/Structural/Decorator/README.rst b/Structural/Decorator/README.rst index 95d234c..b40ac69 100644 --- a/Structural/Decorator/README.rst +++ b/Structural/Decorator/README.rst @@ -31,30 +31,30 @@ RendererInterface.php :language: php :linenos: -RenderInXml.php - -.. literalinclude:: RenderInXml.php - :language: php - :linenos: - Webservice.php .. literalinclude:: Webservice.php :language: php :linenos: -RenderInJson.php - -.. literalinclude:: RenderInJson.php - :language: php - :linenos: - Decorator.php .. literalinclude:: Decorator.php :language: php :linenos: +RenderInXml.php + +.. literalinclude:: RenderInXml.php + :language: php + :linenos: + +RenderInJson.php + +.. literalinclude:: RenderInJson.php + :language: php + :linenos: + Test ---- diff --git a/Structural/DependencyInjection/README.rst b/Structural/DependencyInjection/README.rst index 8200cc1..2446c2c 100644 --- a/Structural/DependencyInjection/README.rst +++ b/Structural/DependencyInjection/README.rst @@ -45,18 +45,6 @@ Code You can also find these code on `GitHub`_ -Connection.php - -.. literalinclude:: Connection.php - :language: php - :linenos: - -ArrayConfig.php - -.. literalinclude:: ArrayConfig.php - :language: php - :linenos: - AbstractConfig.php .. literalinclude:: AbstractConfig.php @@ -69,6 +57,18 @@ Parameters.php :language: php :linenos: +ArrayConfig.php + +.. literalinclude:: ArrayConfig.php + :language: php + :linenos: + +Connection.php + +.. literalinclude:: Connection.php + :language: php + :linenos: + Test ---- diff --git a/Structural/Facade/README.rst b/Structural/Facade/README.rst index 5be63e7..1148b5e 100644 --- a/Structural/Facade/README.rst +++ b/Structural/Facade/README.rst @@ -35,18 +35,18 @@ Code You can also find these code on `GitHub`_ -OsInterface.php - -.. literalinclude:: OsInterface.php - :language: php - :linenos: - Facade.php .. literalinclude:: Facade.php :language: php :linenos: +OsInterface.php + +.. literalinclude:: OsInterface.php + :language: php + :linenos: + BiosInterface.php .. literalinclude:: BiosInterface.php diff --git a/Structural/Proxy/README.rst b/Structural/Proxy/README.rst index f9aa24e..b60baea 100644 --- a/Structural/Proxy/README.rst +++ b/Structural/Proxy/README.rst @@ -25,18 +25,18 @@ Code You can also find these code on `GitHub`_ -RecordProxy.php - -.. literalinclude:: RecordProxy.php - :language: php - :linenos: - Record.php .. literalinclude:: Record.php :language: php :linenos: +RecordProxy.php + +.. literalinclude:: RecordProxy.php + :language: php + :linenos: + Test ---- diff --git a/conf.py b/conf.py index 6df45f4..87f2d27 100644 --- a/conf.py +++ b/conf.py @@ -47,8 +47,8 @@ master_doc = 'README' # General information about the project. project = u'DesignPatternsPHP' -copyright = u'2015, Dominik Liebler' -author = u'Dominik Liebler with contributors' +copyright = u'2015, Dominik Liebler and contributors' +author = u'Dominik Liebler and contributors' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -223,7 +223,7 @@ latex_elements = { # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'DesignPatternsPHP.tex', u'DesignPatternsPHP Documentation', - u'Dominik Liebler with contributors', 'manual'), + u'Dominik Liebler and contributors', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of From 65cc90e9740dd028363fd4b007895f284c088f07 Mon Sep 17 00:00:00 2001 From: Faust Date: Wed, 8 Apr 2015 23:19:24 +0200 Subject: [PATCH 14/14] sort php files Behavioral and More --- Behavioral/ChainOfResponsibilities/README.rst | 16 ++++----- Behavioral/Command/README.rst | 12 +++---- Behavioral/Iterator/README.rst | 12 +++---- Behavioral/Memento/README.rst | 12 +++---- Behavioral/NullObject/README.rst | 24 ++++++------- Behavioral/Observer/README.rst | 12 +++---- Behavioral/Specification/README.rst | 20 +++++------ Behavioral/State/README.rst | 8 ++--- Behavioral/Strategy/README.rst | 24 ++++++------- Behavioral/TemplateMethod/README.rst | 12 +++---- Behavioral/Visitor/README.rst | 20 +++++------ More/Repository/README.rst | 16 ++++----- More/ServiceLocator/README.rst | 36 +++++++++---------- 13 files changed, 112 insertions(+), 112 deletions(-) diff --git a/Behavioral/ChainOfResponsibilities/README.rst b/Behavioral/ChainOfResponsibilities/README.rst index 582faec..06a828c 100644 --- a/Behavioral/ChainOfResponsibilities/README.rst +++ b/Behavioral/ChainOfResponsibilities/README.rst @@ -33,21 +33,15 @@ Code You can also find these code on `GitHub`_ -Handler.php - -.. literalinclude:: Handler.php - :language: php - :linenos: - Request.php .. literalinclude:: Request.php :language: php :linenos: -Responsible/FastStorage.php +Handler.php -.. literalinclude:: Responsible/FastStorage.php +.. literalinclude:: Handler.php :language: php :linenos: @@ -57,6 +51,12 @@ Responsible/SlowStorage.php :language: php :linenos: +Responsible/FastStorage.php + +.. literalinclude:: Responsible/FastStorage.php + :language: php + :linenos: + Test ---- diff --git a/Behavioral/Command/README.rst b/Behavioral/Command/README.rst index fc93d8e..2bcf1d4 100644 --- a/Behavioral/Command/README.rst +++ b/Behavioral/Command/README.rst @@ -40,6 +40,12 @@ Code You can also find these code on `GitHub`_ +CommandInterface.php + +.. literalinclude:: CommandInterface.php + :language: php + :linenos: + HelloCommand.php .. literalinclude:: HelloCommand.php @@ -52,12 +58,6 @@ Receiver.php :language: php :linenos: -CommandInterface.php - -.. literalinclude:: CommandInterface.php - :language: php - :linenos: - Invoker.php .. literalinclude:: Invoker.php diff --git a/Behavioral/Iterator/README.rst b/Behavioral/Iterator/README.rst index cb5195a..dbe1199 100644 --- a/Behavioral/Iterator/README.rst +++ b/Behavioral/Iterator/README.rst @@ -33,15 +33,15 @@ Code You can also find these code on `GitHub`_ -BookList.php +Book.php -.. literalinclude:: BookList.php +.. literalinclude:: Book.php :language: php :linenos: -BookListReverseIterator.php +BookList.php -.. literalinclude:: BookListReverseIterator.php +.. literalinclude:: BookList.php :language: php :linenos: @@ -51,9 +51,9 @@ BookListIterator.php :language: php :linenos: -Book.php +BookListReverseIterator.php -.. literalinclude:: Book.php +.. literalinclude:: BookListReverseIterator.php :language: php :linenos: diff --git a/Behavioral/Memento/README.rst b/Behavioral/Memento/README.rst index 50b8046..a9b86c7 100644 --- a/Behavioral/Memento/README.rst +++ b/Behavioral/Memento/README.rst @@ -37,12 +37,6 @@ Code You can also find these code on `GitHub`_ -Caretaker.php - -.. literalinclude:: Caretaker.php - :language: php - :linenos: - Memento.php .. literalinclude:: Memento.php @@ -55,6 +49,12 @@ Originator.php :language: php :linenos: +Caretaker.php + +.. literalinclude:: Caretaker.php + :language: php + :linenos: + Test ---- diff --git a/Behavioral/NullObject/README.rst b/Behavioral/NullObject/README.rst index c969326..187b621 100644 --- a/Behavioral/NullObject/README.rst +++ b/Behavioral/NullObject/README.rst @@ -38,18 +38,6 @@ Code You can also find these code on `GitHub`_ -PrintLogger.php - -.. literalinclude:: PrintLogger.php - :language: php - :linenos: - -NullLogger.php - -.. literalinclude:: NullLogger.php - :language: php - :linenos: - Service.php .. literalinclude:: Service.php @@ -62,6 +50,18 @@ LoggerInterface.php :language: php :linenos: +PrintLogger.php + +.. literalinclude:: PrintLogger.php + :language: php + :linenos: + +NullLogger.php + +.. literalinclude:: NullLogger.php + :language: php + :linenos: + Test ---- diff --git a/Behavioral/Observer/README.rst b/Behavioral/Observer/README.rst index 00dd00d..9a6a230 100644 --- a/Behavioral/Observer/README.rst +++ b/Behavioral/Observer/README.rst @@ -33,18 +33,18 @@ Code You can also find these code on `GitHub`_ -UserObserver.php - -.. literalinclude:: UserObserver.php - :language: php - :linenos: - User.php .. literalinclude:: User.php :language: php :linenos: +UserObserver.php + +.. literalinclude:: UserObserver.php + :language: php + :linenos: + Test ---- diff --git a/Behavioral/Specification/README.rst b/Behavioral/Specification/README.rst index 2aac692..8e3106b 100644 --- a/Behavioral/Specification/README.rst +++ b/Behavioral/Specification/README.rst @@ -21,15 +21,9 @@ Code You can also find these code on `GitHub`_ -Either.php +Item.php -.. literalinclude:: Either.php - :language: php - :linenos: - -PriceSpecification.php - -.. literalinclude:: PriceSpecification.php +.. literalinclude:: Item.php :language: php :linenos: @@ -45,9 +39,15 @@ AbstractSpecification.php :language: php :linenos: -Item.php +Either.php -.. literalinclude:: Item.php +.. literalinclude:: Either.php + :language: php + :linenos: + +PriceSpecification.php + +.. literalinclude:: PriceSpecification.php :language: php :linenos: diff --git a/Behavioral/State/README.rst b/Behavioral/State/README.rst index ff7185e..f5a2b19 100644 --- a/Behavioral/State/README.rst +++ b/Behavioral/State/README.rst @@ -20,9 +20,9 @@ Code You can also find these code on `GitHub`_ -OrderInterface.php +OrderController.php -.. literalinclude:: OrderInterface.php +.. literalinclude:: OrderController.php :language: php :linenos: @@ -32,9 +32,9 @@ OrderFactory.php :language: php :linenos: -OrderController.php +OrderInterface.php -.. literalinclude:: OrderController.php +.. literalinclude:: OrderInterface.php :language: php :linenos: diff --git a/Behavioral/Strategy/README.rst b/Behavioral/Strategy/README.rst index 3853771..940c716 100644 --- a/Behavioral/Strategy/README.rst +++ b/Behavioral/Strategy/README.rst @@ -34,18 +34,6 @@ Code You can also find these code on `GitHub`_ -DateComparator.php - -.. literalinclude:: DateComparator.php - :language: php - :linenos: - -IdComparator.php - -.. literalinclude:: IdComparator.php - :language: php - :linenos: - ObjectCollection.php .. literalinclude:: ObjectCollection.php @@ -58,6 +46,18 @@ ComparatorInterface.php :language: php :linenos: +DateComparator.php + +.. literalinclude:: DateComparator.php + :language: php + :linenos: + +IdComparator.php + +.. literalinclude:: IdComparator.php + :language: php + :linenos: + Test ---- diff --git a/Behavioral/TemplateMethod/README.rst b/Behavioral/TemplateMethod/README.rst index 0239c0f..0397753 100644 --- a/Behavioral/TemplateMethod/README.rst +++ b/Behavioral/TemplateMethod/README.rst @@ -33,12 +33,6 @@ Code You can also find these code on `GitHub`_ -CityJourney.php - -.. literalinclude:: CityJourney.php - :language: php - :linenos: - Journey.php .. literalinclude:: Journey.php @@ -51,6 +45,12 @@ BeachJourney.php :language: php :linenos: +CityJourney.php + +.. literalinclude:: CityJourney.php + :language: php + :linenos: + Test ---- diff --git a/Behavioral/Visitor/README.rst b/Behavioral/Visitor/README.rst index 4fca151..3d88f0d 100644 --- a/Behavioral/Visitor/README.rst +++ b/Behavioral/Visitor/README.rst @@ -25,15 +25,9 @@ Code You can also find these code on `GitHub`_ -Group.php +RoleVisitorInterface.php -.. literalinclude:: Group.php - :language: php - :linenos: - -Role.php - -.. literalinclude:: Role.php +.. literalinclude:: RoleVisitorInterface.php :language: php :linenos: @@ -43,15 +37,21 @@ RolePrintVisitor.php :language: php :linenos: +Role.php + +.. literalinclude:: Role.php + :language: php + :linenos: + User.php .. literalinclude:: User.php :language: php :linenos: -RoleVisitorInterface.php +Group.php -.. literalinclude:: RoleVisitorInterface.php +.. literalinclude:: Group.php :language: php :linenos: diff --git a/More/Repository/README.rst b/More/Repository/README.rst index 504be8b..48ac018 100644 --- a/More/Repository/README.rst +++ b/More/Repository/README.rst @@ -31,21 +31,15 @@ Code You can also find these code on `GitHub`_ -PostRepository.php - -.. literalinclude:: PostRepository.php - :language: php - :linenos: - Post.php .. literalinclude:: Post.php :language: php :linenos: -MemoryStorage.php +PostRepository.php -.. literalinclude:: MemoryStorage.php +.. literalinclude:: PostRepository.php :language: php :linenos: @@ -55,6 +49,12 @@ Storage.php :language: php :linenos: +MemoryStorage.php + +.. literalinclude:: MemoryStorage.php + :language: php + :linenos: + Test ---- diff --git a/More/ServiceLocator/README.rst b/More/ServiceLocator/README.rst index f7e69a2..1ffa792 100644 --- a/More/ServiceLocator/README.rst +++ b/More/ServiceLocator/README.rst @@ -35,24 +35,6 @@ Code You can also find these code on `GitHub`_ -LogService.php - -.. literalinclude:: LogService.php - :language: php - :linenos: - -LogServiceInterface.php - -.. literalinclude:: LogServiceInterface.php - :language: php - :linenos: - -DatabaseServiceInterface.php - -.. literalinclude:: DatabaseServiceInterface.php - :language: php - :linenos: - ServiceLocatorInterface.php .. literalinclude:: ServiceLocatorInterface.php @@ -65,6 +47,24 @@ ServiceLocator.php :language: php :linenos: +LogServiceInterface.php + +.. literalinclude:: LogServiceInterface.php + :language: php + :linenos: + +LogService.php + +.. literalinclude:: LogService.php + :language: php + :linenos: + +DatabaseServiceInterface.php + +.. literalinclude:: DatabaseServiceInterface.php + :language: php + :linenos: + DatabaseService.php .. literalinclude:: DatabaseService.php