| Design patterns are a useful aid to software engineers. They describe known solutions to recurring problems in software design, and form a vocabulary for communicating these solutions to others. Selecting design patterns that are compatible with the stated non-functional goals of a software project is a difficult problem. In particular, while design patterns describe their direct impact on a small set of non-functional requirements, the indirect effects of the pattern in a particular context is unknown.; We describe a method for formally specifying design patterns, non-functional requirements and their interactions. We introduce an evaluation algorithm that uses a pattern as the basis for a traversal over a graph of non-functional requirements to determine how each is affected. Finally, we present a software tool that operates on catalogues of patterns, non-functional requirements and forces to determine the impact of each of the patterns on a specified set of non-functional requirements. |