- [Instructor] In the last lesson,
we defined the decorator pattern,
as well as added a couple of decorator classes
to some existing code.
I'm looking at the exercise files
found under Chapter Three, Lesson Eight,
within the Start folder.
We added the GoldenInventoryItem
and DiamondInventoryItem to this index.js file,
and we also created golden necklaces,
A Diamond Gold Necklace,
and a Diamond Walkman.
In this lesson, we need to actually write the code
for the GoldenInventoryItem
and DiamondInventoryItem decorator classes.
So let's go ahead and open up our inventory item file.
So we'll go ahead and add the decorators right here,
next to the InventoryItem.
So I'm going to go ahead and add
a class GoldenInventoryItem,
and a class for DiamondInventoryItem,
and we're just going to export all three
of these things together within the same object,
so I'll make sure that I export my GoldenInventoryItem class
and DiamondInventoryItem class,
right in my module exports.
And that's because we are actually pulling
all of these three items from the same InventoryItem module.
So for GoldenInventoryItem, what we want to do is
give it a constructor,
and the constructor takes in the baseItem.
And what we're going to do is
we're going to add to the existing baseItem.
So the golden item's name will have "Golden" in it.
So we'll take the baseItem name,
and we'll extend it by adding the word Golden
in front of it.
We'll also take the price of the item,
so whatever the baseItem price is,
we'll just add 1000 to that.
So we are extending the baseItem.
It costs a little more, and the description has changed.
Let's do the same thing with the DiamondInventoryItem.
So we'll create a constructor,
so again we're taking in the baseItem
and we want to decorate it,
so this.name is going to equal Diamond,
and the DiamondInventoryItem will also affect the price,
so this.price is also going to be
another 1000 plus baseItem price.
Now, decorators do not have to match
the exact same interface,
they don't have to have the exact same fields
and methods that our baseItem has.
We can actually add more functionality.
For instance, the Diamond can cut glass.
So this.cutsGlass is equal to true.
We can also overwrite or modify any of the methods.
So when we print the diamond,
we'll do something a little different,
we'll go ahead and console log this.name
costs a lot of money.
So these items are decorators.
They take in a base item, or a base class,
and they extend its functionality.
In this case, we add some more to the price.
We change the description of the item.
And in the case of the DiamondInventoryItem,
we've overwritten the print method.
So now let's go into our index.js file,
and let's see what happens if Alex purchases
a Diamond Gold Necklace,
and Alex purchases a Diamond Walkman.
So we'll go ahead and save that,
and then come out to our terminal
and run our application, node index.js.
And we see that we cannot afford a Diamond Gold Necklace,
and we cannot afford a Diamond Walkman,
so I haven't purchased any items.
What we're going to have to do is give Alex some money
so that he can make these purchases.
Let's give Alex $3000 dollars.
So we've changed the value
that we sent to the Shopper constructor on line eight,
and then we're going to come out here in the terminal
and run our application again.
And when we do so, we can see
that we're purchasing the Golden Necklace
and we cannot afford the Diamond Walkman,
because the Diamond Walkman's very expensive,
we actually have to give Alex $4000 dollars
to be able to afford that,
so I'll change that value one more time,
clear this, and then node our index.js.
And there we go, so Alex can finally afford
both the Diamond Golden Necklace
and the Diamond Walkman.
So you can see that I've purchased two items.
And, we extended the base inventory item.
The base item was called the Necklace.
Well, we took the Necklace and made it a Golden Necklace,
added 1000 to its cost, and then we took the Necklace
and made it a Diamond Golden Necklace
and added another $1000 dollars to the cost.
And the Diamond Walkman also adds $1000 dollars
to the walkman cost, as well as it adds the word Diamond
in front of it.
Let's go ahead and print our walkman,
and see what we get with that.
So I've added a call to the print method
on the Diamond Walkman, and then when we run that,
we see that the Diamond Walkman costs a lot of money.