Balking pattern
|
|
This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed. (December 2010) |
|
|
This article includes a list of references, related reading or external links, but its sources remain unclear because it lacks inline citations. Please improve this article by introducing more precise citations. (December 2010) |
The balking pattern is a software design pattern that only executes an action on an object when the object is in a particular state. For example, if an object reads ZIP files and a calling method invokes a get method on the object when the ZIP file is not open, the object would "balk" at the request. In the Java programming language, for example, an IllegalStateException might be thrown under these circumstances.
There are some specialists[who?] in this field who think this is more of an anti-pattern, than a design pattern. If an object cannot support its API, it should either limit the API so that the offending call is not available or so that the call can be made without limitation, it should:
- Be created in a sane state
- Not make itself available until it is in a sane state
- Become a facade and answer back an object that is in a sane state
Contents |
[edit] Usage
Objects that use this pattern are generally only in a state that is prone to balking temporarily but for an unknown amount of time.[citation needed] If objects are to remain in a state which is prone to balking for a known, finite period of time, then the guarded suspension pattern may be preferred.
[edit] Implementation
Below is a general, simple example for an implementation of the balking pattern as originally seen in Grand (2002). As demonstrated by the definition above, notice how the "synchronized" line is utilized. If there are multiple calls to the job method, only one will proceed while the other calls will return with nothing. Another thing to note is the jobCompleted() method. The reason it is synchronized is because the only way to guarantee another thread will see a change to a field is to synchronize access all access to it or declare it as volatile.
public class Example { private boolean jobInProgress = false; public void job() { synchronized(this) { if (jobInProgress) { return; } jobInProgress = true; } // Code to execute job goes here // ... } void jobCompleted() { synchronized(this) { jobInProgress = false; } } }
[edit] References
- Grand, Mark (2002), Patterns in Java, Volume 1: A Catalog of Reusable Design Patterns Illustrated with UML, Second Edition, Indianapolis, Ind: John Wiley & Sons.