npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

design-patterns-core-api

v0.1.33

Published

Implementation of the original ("Gang Of Four") Design Patterns

Downloads

41

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 to mixin-interface-api.
    • New Log API is MxI.$Log.write() (previously MxI.$System.log()) and MxI.$Log.addSink() (to set the target of trace requests).
    • Thus this package now directly depends from mixin-interface-api (and no more from mixin-interface).

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 when IAdapter.request() calls IAdaptee.specificRequest()). The second is to avoid counterproductive class proliferation by using xxx_id argument as a way to make the call more specific (e.g. 'request_id' argument when calling IHandler.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.
Abstract Factory UML model

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.
Observer UML model

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

Install NodeJS and Git

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