In the context of the use case presented in this chapter, we could have implemented the weapon system without the Decorator pattern and with ScriptableObjects only. We could have iterated through a list of acquired weapon attachments and apply each of their properties to those of a Weapon class. We would lose the ability of chaining decorators, but our code will be more straightforward.
The core benefit of using the Decorator pattern in our case was that it gave us a structured and repeatable approach to implementing our system. Still, in consequence, we added additional complexity to our code base.