Implementing Behavioral Design Patterns
1. Implementing Strategy Pattern
Example: Pluggable algorithm
interface ShippingStrategy { Money cost(Order o); }
class GroundShipping implements ShippingStrategy { ... }
class ExpressShipping implements ShippingStrategy { ... }
class Checkout {
private final ShippingStrategy shipping;
Checkout(ShippingStrategy s) { this.shipping = s; }
Money total(Order o) { return o.subTotal().plus(shipping.cost(o)); }
}
2. Implementing Observer Pattern
Example: Publish/subscribe
class EventBus<E> {
private final List<Consumer<E>> listeners = new CopyOnWriteArrayList<>();
public void subscribe(Consumer<E> l) { listeners.add(l); }
public void publish(E event) { listeners.forEach(l -> l.accept(event)); }
}
3. Implementing Command Pattern
Example: Encapsulate request
interface Command { void execute(); void undo(); }
class TransferCommand implements Command {
private final Account from, to; private final Money amount;
public void execute() { from.withdraw(amount); to.deposit(amount); }
public void undo() { to.withdraw(amount); from.deposit(amount); }
}
4. Implementing Template Method Pattern
Example: Skeleton + hooks
abstract class ReportGenerator {
public final Report generate() {
var data = fetch();
var processed = transform(data);
return render(processed);
}
protected abstract Data fetch();
protected abstract Data transform(Data d);
protected Report render(Data d) { return new HtmlReport(d); }
}
5. Implementing Iterator Pattern
| Java API | Detail |
|---|---|
Iterator<T> | hasNext(), next(), remove() |
Iterable<T> | For-each support |
Spliterator | Parallel iteration |
Stream | Functional iteration |
6. Implementing Chain of Responsibility Pattern
Example: Pipeline of handlers
abstract class Handler {
protected Handler next;
public Handler chain(Handler n) { this.next = n; return n; }
public final void handle(Request r) {
if (process(r) == false && next != null) next.handle(r);
}
protected abstract boolean process(Request r);
}
7. Implementing State Pattern
Example: State-driven order
interface OrderState { OrderState pay(Order o); OrderState ship(Order o); }
enum States implements OrderState {
NEW {
public OrderState pay(Order o) { o.markPaid(); return PAID; }
public OrderState ship(Order o) { throw new IllegalStateException(); }
},
PAID {
public OrderState pay(Order o) { throw new IllegalStateException(); }
public OrderState ship(Order o) { o.dispatch(); return SHIPPED; }
},
SHIPPED { ... }
}
8. Implementing Visitor Pattern
| Element | Role |
|---|---|
| Element | Has accept(Visitor) |
| Visitor | One method per element type |
| Modern Java | Pattern-matching switch on sealed types Java 21+ |
9. Implementing Mediator Pattern
| Element | Role |
|---|---|
| Mediator | Coordinates colleagues |
| Colleagues | Communicate only via mediator |
| Goal | Reduce N×N coupling to N×1 |
| Java example | Spring ApplicationEventPublisher |
10. Implementing Memento Pattern
Example: Snapshot + restore
class Editor {
private String text;
public Memento save() { return new Memento(text); }
public void restore(Memento m) { this.text = m.state(); }
public record Memento(String state) {}
}
11. Implementing Null Object Pattern
Example: No-op default
interface Logger { void log(String m); }
class NoopLogger implements Logger { public void log(String m) {} }
Logger logger = config.enabled() ? new FileLogger(...) : new NoopLogger();
12. Implementing Specification Pattern
Example: Composable predicate
interface Spec<T> {
boolean isSatisfiedBy(T t);
default Spec<T> and(Spec<T> o) { return t -> isSatisfiedBy(t) && o.isSatisfiedBy(t); }
default Spec<T> or(Spec<T> o) { return t -> isSatisfiedBy(t) || o.isSatisfiedBy(t); }
default Spec<T> not() { return t -> !isSatisfiedBy(t); }
}
Spec<Order> eligible = isPaid.and(notExpired).and(hasStock);
13. Implementing State Pattern with Sealed Classes
Example: Exhaustive states Java 17+
sealed interface OrderState permits New, Paid, Shipped, Cancelled {}
record New() implements OrderState {}
record Paid(Instant paidAt) implements OrderState {}
record Shipped(String tracking) implements OrderState {}
record Cancelled(String reason) implements OrderState {}
String label(OrderState s) {
return switch (s) {
case New n -> "new";
case Paid p -> "paid at " + p.paidAt();
case Shipped sh -> "shipped " + sh.tracking();
case Cancelled c -> "cancelled: " + c.reason();
};
}