design-patterns-core-api
v0.1.33
Published
Implementation of the original ("Gang Of Four") Design Patterns
Downloads
41
Maintainers
Readme
design-patterns-core-api
Implementation of the 23 original ("Gang Of Four") Design Patterns as Interface classes (by means of mixin-interface-api).
ATM this framework provides 20 out of the 23 'Original Patterns' described by the Gang of Four in their 1995's book (Elements of Reusable Object-Oriented Software). There are further design patterns described later (e.g. Patterns of Enterprise Architecture Application written by Martin Fowler).
Your feedback (via GitHub) is welcome especially to report bugs or design issues, request for features or enhancements and contribute to the 'religious' aspects of this project, like which patterns are in fact Antipatterns or if it depends on the context (e.g. Singleton, Service Locator...).
Note about Design Issues
- Craft a proposal for each pattern: there are many references about Design Patterns. My proposals should be not be taken as reference but more as an ongoing work (for which your feedback is welcome). Thus I advise you to study by yourself the references (I have gathered some of them in the References paragraph) to check it they fits your learning curve and your own design issues.
- Resolve name conflicts across patterns: in the references, it happens that participant names (and operation names as well) are shared across patterns. In my proposals, I resolved these name conflicts either by mining in the references or by adding parent interface classes (e.g. IElement, _IAction, ICoreComponent...).
Release 0.1.33 changelog
- Impact of Log feature refactoring (please find reference documentation here):
- Implementation of Log feature redesigned and moved from
mixin-interface
tomixin-interface-api
. - New Log API is
MxI.$Log.write()
(previouslyMxI.$System.log()
) andMxI.$Log.addSink()
(to set the target of trace requests). - Thus this package now directly depends from
mixin-interface-api
(and no more frommixin-interface
).
- Implementation of Log feature redesigned and moved from
Release 0.1.20 changelog
- Design Issue: 'IProduct' interface is a misfit
- Fix: Delete 'IProduct' move its 'getAttribute()' method in 'IElement' then update 'IProduct' dependents so that they depend on 'IElement' instead
Roadmap
- UML class diagrams and implementation sample for each pattern
Preliminary notes
Naming convention: for any given interface class, its name is written with PascalCase convention (e.g.
IAbstractFactory
) and its source code uses snake_case convention (e.g.i_abstract_factory.js
)
Why
...args
? Thanks to the rest parameter feature of javascript es6 (...args
), most interface services accept optional and variable number of arguments.
What is the purpose of
xxx_id
arguments ? This is a design choice motivated by 2 design intents. The first is when the service call is propagated (e.g. 'request_id' argument is propagated by Adapter whenIAdapter.request()
callsIAdaptee.specificRequest()
). The second is to avoid counterproductive class proliferation by usingxxx_id
argument as a way to make the call more specific (e.g. 'request_id' argument when callingIHandler.handleRequest()
within the Chain Of Responsability pattern)
Creational patterns
Abstract Factory
Interface classes: IAbstractFactory, IElement.
Detailed description: Enginyeria del Software I - Curs 2006-2007 - Abstract Factory.
Factory Method
Interface classes: I_Creator, IElement.
Detailed description: Enginyeria del Software I - Curs 2006-2007 - Factory Method.
Builder
Interface classes: IBuilder, IElement.
Detailed description: BlackWasp - Builder design pattern.
Singleton
Interface classes: MxI.$ISingleton.
Detailed description: Enginyeria del Software I - Curs 2006-2007 - Singleton.
Behavioral patterns
Observer
Interface classes: IObserver and IObservable.
Detailed description: Enginyeria del Software I - Curs 2006-2007 - Observer.
Iterator
Interface classes: IIterator, ICollection.
Detailed description: Tutorials Point - Design Patterns: Iterator pattern.
State
Interface classes: IState, IStateContext.
Detailed description: Enginyeria del Software I - Curs 2006-2007 - State.
Chain of Responsability
Interface classes: IHandler, IRequest.
Detailed description: OOODesign - Chain of Responsability.
Visitor
Interface classes: IVisitor, IElement.
Detailed description: Tutorials Point - Design Patterns: Visitor pattern.
Memento
Interface classes: IMemento, IOriginator, ICareTaker.
Detailed description: Tutorials Point - Design Patterns: Memento pattern.
Strategy
Interface classes: IStrategy, IStrategyContext.
Detailed description: Tutorials Point - Design Patterns: Strategy pattern.
Command
Interface classes: ICommand, IInvoker, IReceiver.
Detailed description: Enginyeria del Software I - Curs 2006-2007 - Command.
Template Method
Interface classes: ITemplateMethod.
Detailed description: Enginyeria del Software I - Curs 2006-2007 - Template Method.
Mediator
Interface classes: IMediator, IColleague, IRequest.
Detailed description: Enginyeria del Software I - Curs 2006-2007 - Mediator.
Structural patterns
Bridge
Interface classes: IImplementor.
Refer to Enginyeria del Software I - Curs 2006-2007 - Bridge.
Adapter
Interface classes: IAdapter, IAdaptee.
Detailed description: Enginyeria del Software I - Curs 2006-2007 - Adapter.
Facade
Interface classes: IFacade.
Detailed description: Tutorials Point - Design Patterns: Memento pattern.
Decorator
Interface classes: IDecorator, ICoreComponent.
Detailed description: Enginyeria del Software I - Curs 2006-2007 - Decorator.
Composite
Interface classes: IComponent, IComposite, ILeaf.
Detailed description: Enginyeria del Software I - Curs 2006-2007 - Composite.
Proxy
Interface classes: ISubject, IProxy.
Detailed description: Enginyeria del Software I - Curs 2006-2007 - Proxy.
Developer's Guide
How to implement a Design Pattern
A given Design Pattern is composed of one or more participants, this is very much like Role(s) in a play. Within design-patterns-api
project, each participant is implemented as an interface classs. Thus, in order to implement a Design Pattern you must implement the interface class(es). Please refer to How to code an Implementation class in the documentation of mixin-interface-api
package.
How to run the Unit Test
Step 1: Install Prerequisite Tools
Step 2: Clone the 'design-patterns-core-api' repository locally
Open a command shell then enter the following commands:
git clone git://github.com/Echopraxium/design-patterns-core-api
cd design-patterns-core-api
npm update
Step 3: Run the Unit Test
Now enter the following command:
node test.js
You should get this kind of output (please find here the full output):
============================================================
===== Unit Test for 'design-patterns-core-api' package =====
============================================================
1. Creational Patterns
----------
1.1. Factory Method
----------
1.2. Builder
----------
1.1. Singleton
...
===================== End of Unit Test =====================
References
- Software Design Pattern (Wikipedia)
https://en.wikipedia.org/wiki/Software_design_pattern - Design Patterns and Anti-Patterns, Love and Hate
http://www.yegor256.com/2016/02/03/design-patterns-and-anti-patterns.html - Behavioral Pattern
https://en.wikipedia.org/wiki/Behavioral_pattern - Design Patterns in Java Tutorial
https://www.tutorialspoint.com/design_pattern/ - SourceMaking / Design Patterns
https://sourcemaking.com/design_patterns - Enginyeria del Software I - Curs 2006-2007
http://ima.udg.edu/~sellares/EINF-ES1/ - OODesign (Object Oriented Design)
http://www.oodesign.com/ - MacDonald Land / Design Patterns Quick Reference
http://www.mcdonaldland.info/files/designpatterns/designpatternscard.pdf - Wikipedia / Software design pattern
https://en.wikipedia.org/wiki/Software_design_pattern - Design Patterns
O. Boissier, G. Picard SMA/G2I/ENS Mines Saint-Etienne http://www.emse.fr/~picard/cours/2A/DesignPatterns.pdf - Elements of Reusable Object-Oriented Software (1995)
Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John