From 53bc8d94f9773013735a299594a9e323404ead13 Mon Sep 17 00:00:00 2001 From: Gopal Singh <43721542+gopalsingh112@users.noreply.github.com> Date: Fri, 15 May 2020 20:26:40 -0700 Subject: [PATCH] Adding chain command state Iterator design patterns --- .../README.md | 20 +++++ .../Chain of Responisibility-Node JS/UML.png | Bin 0 -> 30750 bytes .../chainofresponsibility.js | 22 ++++++ .../Command Pattern-Node JS/README.md | 17 ++++ .../Command Pattern-Node JS/UML.png | Bin 0 -> 28826 bytes .../Command Pattern-Node JS/command.js | 30 +++++++ .../Iterator Pattern-Node JS/Iterator.js | 25 ++++++ .../Iterator Pattern-Node JS/README.md | 23 ++++++ .../Iterator Pattern-Node JS/UML.png | Bin 0 -> 18024 bytes .../State Pattern-Node JS/README.md | 22 ++++++ design-patterns/State Pattern-Node JS/UML.jpg | Bin 0 -> 31794 bytes .../State Pattern-Node JS/state.js | 74 ++++++++++++++++++ 12 files changed, 233 insertions(+) create mode 100644 design-patterns/Chain of Responisibility-Node JS/README.md create mode 100644 design-patterns/Chain of Responisibility-Node JS/UML.png create mode 100644 design-patterns/Chain of Responisibility-Node JS/chainofresponsibility.js create mode 100644 design-patterns/Command Pattern-Node JS/README.md create mode 100644 design-patterns/Command Pattern-Node JS/UML.png create mode 100644 design-patterns/Command Pattern-Node JS/command.js create mode 100644 design-patterns/Iterator Pattern-Node JS/Iterator.js create mode 100644 design-patterns/Iterator Pattern-Node JS/README.md create mode 100644 design-patterns/Iterator Pattern-Node JS/UML.png create mode 100644 design-patterns/State Pattern-Node JS/README.md create mode 100644 design-patterns/State Pattern-Node JS/UML.jpg create mode 100644 design-patterns/State Pattern-Node JS/state.js diff --git a/design-patterns/Chain of Responisibility-Node JS/README.md b/design-patterns/Chain of Responisibility-Node JS/README.md new file mode 100644 index 0000000..f0eb513 --- /dev/null +++ b/design-patterns/Chain of Responisibility-Node JS/README.md @@ -0,0 +1,20 @@ +# Chain of Respoinsibility Pattern + +1. The Chain of Responsibility pattern provides a chain of loosely coupled objects one of which can satisfy a request. This pattern is essentially a linear search for an object that can handle a particular request. + +2. It is like event-bubbling in which an event propagates through a series of nested controls one of which may choose to handle the event. The Chain of Responsiblity patterns is related to the Chaining Pattern which is frequently used in JavaScript. + +3. In this example, we create a class CumulativeAddition, which can be instantiated with an optional initialsum. It has a method add that adds the passed value to the sum attribute of the object and returns the object itself to allow chaining of add method calls. + + +##### JavaScript example + +![](UML.png) + + +###### Output +``` +12 +35 +108 +``` \ No newline at end of file diff --git a/design-patterns/Chain of Responisibility-Node JS/UML.png b/design-patterns/Chain of Responisibility-Node JS/UML.png new file mode 100644 index 0000000000000000000000000000000000000000..d429a920de32874b4553373a11f02643b5b68b3d GIT binary patch literal 30750 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 literal 0 HcmV?d00001 diff --git a/design-patterns/Command Pattern-Node JS/command.js b/design-patterns/Command Pattern-Node JS/command.js new file mode 100644 index 0000000..d725e94 --- /dev/null +++ b/design-patterns/Command Pattern-Node JS/command.js @@ -0,0 +1,30 @@ +class Math { + constructor(num) { + this._num = num; + } + square() { + return this._num ** 2; + } + + cube() { + return this._num ** 3; + } +} + +class Command { + constructor(subject) { + this._subject = subject; + this.commandsExecuted = []; + } + execute(command) { + this.commandsExecuted.push(command); + return this._subject[command](); + } +} + +let x = new Command(new Math(5)); +x.execute('square'); +x.execute('cube'); + +console.log(x.commandsExecuted); + diff --git a/design-patterns/Iterator Pattern-Node JS/Iterator.js b/design-patterns/Iterator Pattern-Node JS/Iterator.js new file mode 100644 index 0000000..1652703 --- /dev/null +++ b/design-patterns/Iterator Pattern-Node JS/Iterator.js @@ -0,0 +1,25 @@ +const items = [630, false ,"Design", 4.1] + +function Iterator(items) +{ + this.items = items + this.index = 0 +} + +Iterator.prototype = { + hasNext: function() + { + return this.index < this.items.length + }, + next: function() + { + return this.items[this.index++] + } +} + +const iter = new Iterator(items) + +while(iter.hasNext() == true) + console.log(iter.next()) + + \ No newline at end of file diff --git a/design-patterns/Iterator Pattern-Node JS/README.md b/design-patterns/Iterator Pattern-Node JS/README.md new file mode 100644 index 0000000..f3a7b04 --- /dev/null +++ b/design-patterns/Iterator Pattern-Node JS/README.md @@ -0,0 +1,23 @@ +# Iterator Design Pattern + +1. The iterator pattern allows us to loop over some collection of objects its a common programming task to iterater over a set of objects may be stored as arrays tree or a graphs. + +2. In addition to traverse the collection of items you may need to access the items in the collection in a certain way or order from first to last or last to first depth first or breath first it its a tree or a graph or skip every two elements or skip every three elements ot anything + +3. The iterator pattern allows you to write the rules on how to traverse some collectio in this example we will +create an array to iterate. + +###### UML +![](UML.png) + +In this example we see a class called math and contains two functions square and cube that returns square of a +number and cube of a number. there is a command class that will records all the commands that are executed so +here we will execute the commands square and cube and when we print the commands we can see that we executed square and cube functions. + +###### output +``` +630 +false +Design +4.1 +``` diff --git a/design-patterns/Iterator Pattern-Node JS/UML.png b/design-patterns/Iterator Pattern-Node JS/UML.png new file mode 100644 index 0000000000000000000000000000000000000000..c66639df87d598dabc409661e671b937f641e913 GIT binary patch literal 18024 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 KHT%Qo?*9PiNcThl literal 0 HcmV?d00001 diff --git a/design-patterns/State Pattern-Node JS/state.js b/design-patterns/State Pattern-Node JS/state.js new file mode 100644 index 0000000..d21b68d --- /dev/null +++ b/design-patterns/State Pattern-Node JS/state.js @@ -0,0 +1,74 @@ +class SDLCstages { + constructor() { + this.states = [new Dev(), new Staging(), new Prod()]; + this.current = this.states[0]; + } + + change() { + const totalStates = this.states.length; + let currentIndex = this.states.findIndex(light => light === this.current); + if (currentIndex + 1 < totalStates) this.current = this.states[currentIndex + 1]; + else this.current = this.states[0]; + } + + sign() { + return this.current.sign(); + } +} + +class States { + constructor(light) { + this.light = light; + } +} + +class Prod extends States { + constructor() { + super('Testing'); + } + + sign() { + return 'Production Testing'; + } +} + +class Staging extends States { + constructor() { + super('Commiting'); + } + + sign() { + return 'Staging Commits'; + } +} + +class Dev extends States { + constructor() { + super('Coding'); + } + + sign() { + return 'Development Coding'; + } +} + + +const product = new SDLCstages(); + +console.log(product.sign()); // 'Development Coding' +product.change(); + +console.log(product.sign()); // 'Staging commits' +product.change(); + +console.log(product.sign()); // 'Production Testing' +product.change(); + +console.log(product.sign()); // 'Development Coding' +product.change(); + +console.log(product.sign()); // 'Staging commits' +product.change(); + +console.log(product.sign()); // 'Production Testing' +