- Specification pattern
In computer programming, the specification pattern is a particular
software design pattern , whereby business logic can be recombined by chaining the business logic together using boolean logic.A Specification pattern outlines a unit of business logic that is combinable with other business logic units. In this pattern, a unit of Business Logic inherits its functionality from the abstract aggregate Composite Specification class. The Composite Specification class has one function called IsSatisfiedBy that returns a boolean value. After instantiation, the specification is 'chained' with other specifications, making new specifications easily maintainable, yet highly customizable business logic. Furthermore upon instantiation the business logic may, through method invocation or
Inversion of Control , have its state altered in order to become a delegate of other classes such as a persistence repository.Diagram
+-----------------+
<>
ISpecification
-----------------
-----------------| +-----------------------+
And() | |Composite Specification
IsSatisifiedBy() |<>------|
Not() | |-----------------------
Or() | |-----------------------
+-----------------+ |And()
IsSatisifiedBy()
+-------------|>|Not() |<|------+
|Or() |
+-----------------------+
.
/_
|
|
|
|
+-----------+---------+ +---------------+-----+ +---------------------+
AndSpecification | | OrSpecification | | NotSpecification
---------------------| |---------------------| |---------------------
ISpecification: One | |ISpecification: One | |ISpecification:
ISpecification: Other| |ISpecification: Other| | Wrapped
---------------------| |---------------------| |---------------------
AndSpecification() | |OrSpecification() | |NotSpecification()
IsSatisfiedBy() | |IsSatisfiedBy() | |IsSatisfiedBy()
+---------------------+ +---------------------+ +---------------------+Code Examples
= C# =Example of use
In this example, we are retrieving invoices and sending them to a collection agency if they are overdue, notices have been sent and they are not already with the collection agency.
We previously defined an OverdueSpecification class that it is satisfied when an invoice's due date is 30 days or older, a NoticeSentSpecification class that is satisfied when three notices have been sent to the customer, and an InCollectionSpecification class that is satisfied when an invoice has already been sent to the collection agency.
Using these three specifications, we created a new specification called SendToCollection which will be satisfied when an invoice is overdue, when notices have been sent to the customer, and are not already with the collection agency.
References
Evans, E: "Domain-Driven Design.", page 224. Addison-Wesley, 2004.
External links
* [http://www.martinfowler.com/apsupp/spec.pdf Specifications] by Eric Evans and Martin Fowler
* [http://www.mattberther.com/2005/03/25/the-specification-pattern-a-primer/ The Specification Pattern: A Primer] by Matt Berther
* [http://www.dpdk.nl/opensource/specification-pattern-for-selection-on-lists specification pattern in flash actionscript 3] by Rolf Vreijdenberger
Wikimedia Foundation. 2010.