# Structural Patterns

> Every principle in this category is listed as a record.

Page: Ontology · Principles
Canonical: https://banes-lab.com/ontology#architecture-category-structural-patterns

Listed in [Ontology · Principles](https://banes-lab.com/api/pages/ontology/principles.md), after [Creational Patterns](https://banes-lab.com/ontology/principles/architecture-category-creational-patterns.md) and before [Scalability / Performance / Optimization](https://banes-lab.com/ontology/principles/architecture-category-scalability-performance-optimization.md).

Every principle in this category is listed as a record. Each record carries its kind, its severity, the scopes it applies at and the layer it lives in, then the edge relations that join it to other records, the records that point back at it, the contracts that answer to it and the tensions it takes part in. The descriptors say how it is violated, detected, measured, repaired and enforced. Where the record carries one, an exemplar shows the shape before and after the principle is applied.

Relations diagram

The relations inside this category.

```mermaid
flowchart LR
n_adapter_pattern["Adapter Pattern"]
n_facade_pattern["Facade Pattern"]
n_proxy_pattern["Proxy Pattern"]
n_bridge_pattern["Bridge Pattern"]
n_decorator_pattern["Decorator Pattern"]
n_composite_pattern["Composite Pattern"]
n_flyweight_pattern["Flyweight Pattern"]
```

### Adapter Pattern

- Kind: [pattern](https://banes-lab.com/records/kind/pattern.md)
- Category: [Structural Patterns](https://banes-lab.com/ontology/principles/architecture-category-structural-patterns.md)
- Severity: [mandatory](https://banes-lab.com/records/vocabulary/severity-mandatory.md)
- Scope: integration, boundary
- Layer: [Design Patterns Core](https://banes-lab.com/records/layer/design-patterns-core.md)

Details

Definition
A design pattern that wraps a component with an incompatible interface so it implements the interface its callers expect.

Requires
[Incompatible Interfaces](https://banes-lab.com/records/lexicon/incompatible-interfaces.md)

Reinforces
[Anti-Corruption Layer](https://banes-lab.com/records/architecture/anti-corruption-layer.md), [Replaceability](https://banes-lab.com/records/architecture/replaceability.md)

Enables
[Interoperability](https://banes-lab.com/records/architecture/interoperability.md)

In tension with
[Mapping Overhead](https://banes-lab.com/records/lexicon/mapping-overhead.md)

Conflicts with
[Direct External Coupling](https://banes-lab.com/records/lexicon/direct-external-coupling.md)

Referenced by
[Interface-Based Design](https://banes-lab.com/records/architecture/interface-based-design.md)

Tensions
[Adapter Pattern / Mapping Overhead](https://banes-lab.com/records/tension/adapter-pattern-mapping-overhead.md)

Distinct from
[Anti-Corruption Layer](https://banes-lab.com/records/architecture/anti-corruption-layer.md): An adapter fits one incompatible interface to the one expected, while an anti-corruption layer translates a whole external model into the local domain's terms.

Violated by
foreign model leaking into core

Detected by
external SDK types in domain/application

Measured by
external leakage count

Refactored by
Add Adapter, Add Translator

Enforced by
boundary import rules

Before

```typescript
function saveFoo(foo: Foo) {
return legacyClient.put(foo.id, foo.name, foo.count);
}
```

After

```typescript
class LegacyFooAdapter implements FooStore {
constructor(private readonly client: LegacyClient) {}
save(foo: Foo) { return this.client.put(foo.id, foo.name, foo.count); }
}
```

How it is checked

Checked by
boundary import rules

Population
Every boundary, wrapper and composite structure that sits between a caller and the objects it uses

Freshness
A verdict stands until the wrapped interface or its callers change

Refusal
The boundary import rule or the conformance test fails a caller that reaches past the structure

Observation
Imports and call sites that cross the structure, read from source

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The structure's interface, which every caller goes through

Depends on
[Incompatible Interfaces](https://banes-lab.com/records/lexicon/incompatible-interfaces.md), [Anti-Corruption Layer](https://banes-lab.com/records/architecture/anti-corruption-layer.md), [Replaceability](https://banes-lab.com/records/architecture/replaceability.md), [Interoperability](https://banes-lab.com/records/architecture/interoperability.md)

Shape it refuses
[Direct External Coupling](https://banes-lab.com/records/lexicon/direct-external-coupling.md)

### Facade Pattern

- Kind: [pattern](https://banes-lab.com/records/kind/pattern.md)
- Category: [Structural Patterns](https://banes-lab.com/ontology/principles/architecture-category-structural-patterns.md)
- Severity: [recommended](https://banes-lab.com/records/vocabulary/severity-recommended.md)
- Scope: module, subsystem, API
- Layer: [Design Patterns Core](https://banes-lab.com/records/layer/design-patterns-core.md)

Details

Definition
A design pattern that gives a subsystem one simple entry point, so callers do not depend on its parts.

Requires
[Subsystem Complexity](https://banes-lab.com/records/lexicon/subsystem-complexity.md)

Reinforces
[Encapsulation](https://banes-lab.com/records/architecture/encapsulation.md), [Information Hiding](https://banes-lab.com/records/architecture/information-hiding.md)

Enables
[Simplified Access](https://banes-lab.com/records/lexicon/simplified-access.md)

In tension with
[Over-Centralization](https://banes-lab.com/records/lexicon/over-centralization.md)

Conflicts with
[Leaky Subsystem API](https://banes-lab.com/records/lexicon/leaky-subsystem-api.md)

Tensions
[Facade Pattern / Over-Centralization](https://banes-lab.com/records/tension/facade-pattern-over-centralization.md)

Violated by
consumers depending on many subsystem internals

Detected by
broad dependency surface to subsystem

Measured by
consumer dependency count

Refactored by
Introduce Facade

Enforced by
API boundary rules

Before

```typescript
const foo = fooValidator.validate(fooParser.parse(raw));
await fooStore.save(foo);
await fooEvents.publish(foo);
```

After

```typescript
class FooFacade {
async create(raw: string) {
const foo = fooValidator.validate(fooParser.parse(raw));
await fooStore.save(foo);
await fooEvents.publish(foo);
}
}
```

How it is checked

Checked by
API boundary rules

Population
Every boundary, wrapper and composite structure that sits between a caller and the objects it uses

Freshness
A verdict stands until the wrapped interface or its callers change

Refusal
The boundary import rule or the conformance test fails a caller that reaches past the structure

Observation
Imports and call sites that cross the structure, read from source

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The structure's interface, which every caller goes through

Depends on
[Subsystem Complexity](https://banes-lab.com/records/lexicon/subsystem-complexity.md), [Encapsulation](https://banes-lab.com/records/architecture/encapsulation.md), [Information Hiding](https://banes-lab.com/records/architecture/information-hiding.md), [Simplified Access](https://banes-lab.com/records/lexicon/simplified-access.md)

Shape it refuses
[Leaky Subsystem API](https://banes-lab.com/records/lexicon/leaky-subsystem-api.md)

### Proxy Pattern

- Kind: [pattern](https://banes-lab.com/records/kind/pattern.md)
- Category: [Structural Patterns](https://banes-lab.com/ontology/principles/architecture-category-structural-patterns.md)
- Severity: [contextual](https://banes-lab.com/records/vocabulary/severity-contextual.md)
- Scope: access control, remote access, lazy loading
- Layer: [Design Patterns Core](https://banes-lab.com/records/layer/design-patterns-core.md)

Details

Definition
A design pattern that places a stand-in with the same interface in front of an object, to control, defer or cache access to it.

Requires
[Controlled Access](https://banes-lab.com/records/lexicon/controlled-access.md)

Reinforces
[Encapsulation](https://banes-lab.com/records/architecture/encapsulation.md), [Security](https://banes-lab.com/records/lexicon/security.md)

Enables
[Lazy Load](https://banes-lab.com/records/lexicon/lazy-load.md), [Authorization](https://banes-lab.com/records/architecture/authorization.md), [Remote Stub](https://banes-lab.com/records/lexicon/remote-stub.md)

In tension with
[Transparency / Debugging](https://banes-lab.com/records/lexicon/transparency-debugging.md)

Conflicts with
[Direct Access](https://banes-lab.com/records/lexicon/direct-access.md)

Tensions
[Proxy Pattern / Transparency / Debugging](https://banes-lab.com/records/tension/proxy-pattern-transparency-debugging.md)

Violated by
uncontrolled direct resource access

Detected by
bypassed access wrapper

Measured by
proxy bypass count

Refactored by
Introduce Proxy

Enforced by
access rules

Before

```typescript
function loadFoo(id: FooId) { return remoteFooStore.find(id); }
```

After

```typescript
class CachingFooStoreProxy implements FooStore {
constructor(private readonly target: FooStore) {}
async find(id: FooId) {
const cached = fooCache.get(id);
if (cached) return cached;
const foo = await this.target.find(id);
fooCache.set(id, foo);
return foo;
}
}
```

How it is checked

Checked by
access rules

Population
Every boundary, wrapper and composite structure that sits between a caller and the objects it uses

Freshness
A verdict stands until the wrapped interface or its callers change

Refusal
The boundary import rule or the conformance test fails a caller that reaches past the structure

Observation
Imports and call sites that cross the structure, read from source

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The structure's interface, which every caller goes through

Depends on
[Controlled Access](https://banes-lab.com/records/lexicon/controlled-access.md), [Encapsulation](https://banes-lab.com/records/architecture/encapsulation.md), [Security](https://banes-lab.com/records/lexicon/security.md), [Lazy Load](https://banes-lab.com/records/lexicon/lazy-load.md), [Authorization](https://banes-lab.com/records/architecture/authorization.md), [Remote Stub](https://banes-lab.com/records/lexicon/remote-stub.md)

Shape it refuses
[Direct Access](https://banes-lab.com/records/lexicon/direct-access.md)

### Bridge Pattern

- Kind: [pattern](https://banes-lab.com/records/kind/pattern.md)
- Category: [Structural Patterns](https://banes-lab.com/ontology/principles/architecture-category-structural-patterns.md)
- Severity: [contextual](https://banes-lab.com/records/vocabulary/severity-contextual.md)
- Scope: abstraction, implementation variation
- Layer: [Design Patterns Core](https://banes-lab.com/records/layer/design-patterns-core.md)

Details

Definition
A design pattern that separates two independent axes of variation into two hierarchies joined by composition.

Requires
[Independent Variation Axes](https://banes-lab.com/records/lexicon/independent-variation-axes.md)

Reinforces
[Composition Over Inheritance](https://banes-lab.com/records/architecture/composition-over-inheritance.md)

Enables
[Implementation Swap](https://banes-lab.com/records/lexicon/implementation-swap.md)

In tension with
[Indirection](https://banes-lab.com/records/lexicon/indirection.md)

Conflicts with
[Cartesian Inheritance Explosion](https://banes-lab.com/records/lexicon/cartesian-inheritance-explosion.md)

Tensions
[Bridge Pattern / Indirection](https://banes-lab.com/records/tension/bridge-pattern-indirection.md)

Violated by
subclass explosion for combinations

Detected by
parallel hierarchies / deep variant classes

Measured by
variant class count

Refactored by
Introduce Bridge

Enforced by
[design review](https://banes-lab.com/records/architecture/design-review.md)

Before

```typescript
class SqlJsonFooExporter {}
class SqlCsvFooExporter {}
class MemoryJsonFooExporter {}
class MemoryCsvFooExporter {}
```

After

```typescript
interface FooSource { read(): Promise<readonly Foo[]>; }
interface FooFormat { encode(foos: readonly Foo[]): string; }
class FooExporter {
constructor(private readonly source: FooSource, private readonly format: FooFormat) {}
async export() { return this.format.encode(await this.source.read()); }
}
```

How it is checked

Checked by
design review

Population
Every boundary, wrapper and composite structure that sits between a caller and the objects it uses

Freshness
A verdict stands until the wrapped interface or its callers change

Refusal
The boundary import rule or the conformance test fails a caller that reaches past the structure

Observation
Imports and call sites that cross the structure, read from source

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The structure's interface, which every caller goes through

Depends on
[Independent Variation Axes](https://banes-lab.com/records/lexicon/independent-variation-axes.md), [Composition Over Inheritance](https://banes-lab.com/records/architecture/composition-over-inheritance.md), [Implementation Swap](https://banes-lab.com/records/lexicon/implementation-swap.md)

Shape it refuses
[Cartesian Inheritance Explosion](https://banes-lab.com/records/lexicon/cartesian-inheritance-explosion.md)

### Decorator Pattern

- Kind: [pattern](https://banes-lab.com/records/kind/pattern.md)
- Category: [Structural Patterns](https://banes-lab.com/ontology/principles/architecture-category-structural-patterns.md)
- Severity: [contextual](https://banes-lab.com/records/vocabulary/severity-contextual.md)
- Scope: behavior composition
- Layer: [Design Patterns Core](https://banes-lab.com/records/layer/design-patterns-core.md)

Details

Definition
A design pattern that adds behavior to an object by wrapping it in another object with the same interface.

Requires
[Common Interface](https://banes-lab.com/records/lexicon/common-interface.md)

Reinforces
[Open/Closed Principle (OCP)](https://banes-lab.com/records/architecture/open-closed.md), [Composability](https://banes-lab.com/records/architecture/composability.md)

Enables
[Runtime Behavior Extension](https://banes-lab.com/records/lexicon/runtime-behavior-extension.md)

In tension with
[Stack Debugging](https://banes-lab.com/records/lexicon/stack-debugging.md)

Conflicts with
[Subclass Explosion](https://banes-lab.com/records/lexicon/subclass-explosion.md)

Referenced by
[Composition Over Inheritance](https://banes-lab.com/records/architecture/composition-over-inheritance.md)

Tensions
[Decorator Pattern / Stack Debugging](https://banes-lab.com/records/tension/decorator-pattern-stack-debugging.md)

Violated by
many subclasses for optional features

Detected by
repeated wrapper-like subclasses

Measured by
variant explosion count

Refactored by
Introduce Decorator

Enforced by
interface conformance tests

Before

```typescript
class LoggedSqlFooStore extends SqlFooStore {
override save(foo: Foo) { logger.info("foo.saved", { fooId: foo.id }); return super.save(foo); }
}
```

After

```typescript
class LoggedFooStore implements FooStore {
constructor(private readonly inner: FooStore, private readonly log: Log) {}
save(foo: Foo) { this.log.write(foo.id); return this.inner.save(foo); }
}
```

How it is checked

Checked by
interface conformance tests

Population
Every boundary, wrapper and composite structure that sits between a caller and the objects it uses

Freshness
A verdict stands until the wrapped interface or its callers change

Refusal
The boundary import rule or the conformance test fails a caller that reaches past the structure

Observation
Imports and call sites that cross the structure, read from source

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The structure's interface, which every caller goes through

Depends on
[Common Interface](https://banes-lab.com/records/lexicon/common-interface.md), [Open/Closed Principle (OCP)](https://banes-lab.com/records/architecture/open-closed.md), [Composability](https://banes-lab.com/records/architecture/composability.md), [Runtime Behavior Extension](https://banes-lab.com/records/lexicon/runtime-behavior-extension.md)

Shape it refuses
[Subclass Explosion](https://banes-lab.com/records/lexicon/subclass-explosion.md)

### Composite Pattern

- Kind: [pattern](https://banes-lab.com/records/kind/pattern.md)
- Category: [Structural Patterns](https://banes-lab.com/ontology/principles/architecture-category-structural-patterns.md)
- Severity: [recommended](https://banes-lab.com/records/vocabulary/severity-recommended.md)
- Scope: structure, tree, hierarchy
- Layer: [Design Patterns Core](https://banes-lab.com/records/layer/design-patterns-core.md)

Details

Definition
A design pattern that gives leaves and groups one interface, so a tree is traversed without checking which kind each node is.

Requires
[Uniform Component Interface](https://banes-lab.com/records/lexicon/uniform-component-interface.md)

Reinforces
[Uniform Interface](https://banes-lab.com/records/architecture/uniform-interface.md), [Open/Closed Principle (OCP)](https://banes-lab.com/records/architecture/open-closed.md)

Enables
[Recursive Composition](https://banes-lab.com/records/lexicon/recursive-composition.md), [Leaf/Composite Transparency](https://banes-lab.com/records/lexicon/leaf-composite-transparency.md)

In tension with
[Type Safety](https://banes-lab.com/records/architecture/type-safety.md)

Conflicts with
[Leaf-vs-Container Special-Casing](https://banes-lab.com/records/lexicon/leaf-vs-container-special-casing.md)

Tensions
[Composite Pattern / Type Safety](https://banes-lab.com/records/tension/composite-pattern-type-safety.md)

Violated by
callers branching on leaf-vs-container at every node

Detected by
isContainer/isLeaf conditionals during traversal

Measured by
node-kind conditional count

Refactored by
Unify Leaf and Composite behind one interface

Enforced by
[design review](https://banes-lab.com/records/architecture/design-review.md)

Before

```typescript
function totalFoo(item: Foo | FooGroup): number {
if ("children" in item) return item.children.reduce((sum, child) => sum + totalFoo(child), 0);
return item.value;
}
```

After

```typescript
interface FooComponent { total(): number; }
class FooLeaf implements FooComponent {
constructor(private readonly value: number) {}
total() { return this.value; }
}
class FooGroup implements FooComponent {
constructor(private readonly children: readonly FooComponent[]) {}
total() { return this.children.reduce((sum, child) => sum + child.total(), 0); }
}
```

How it is checked

Checked by
design review

Population
Every boundary, wrapper and composite structure that sits between a caller and the objects it uses

Freshness
A verdict stands until the wrapped interface or its callers change

Refusal
The boundary import rule or the conformance test fails a caller that reaches past the structure

Observation
Imports and call sites that cross the structure, read from source

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The structure's interface, which every caller goes through

Depends on
[Uniform Component Interface](https://banes-lab.com/records/lexicon/uniform-component-interface.md), [Uniform Interface](https://banes-lab.com/records/architecture/uniform-interface.md), [Open/Closed Principle (OCP)](https://banes-lab.com/records/architecture/open-closed.md), [Recursive Composition](https://banes-lab.com/records/lexicon/recursive-composition.md), [Leaf/Composite Transparency](https://banes-lab.com/records/lexicon/leaf-composite-transparency.md)

Shape it refuses
[Leaf-vs-Container Special-Casing](https://banes-lab.com/records/lexicon/leaf-vs-container-special-casing.md)

### Flyweight Pattern

- Kind: [pattern](https://banes-lab.com/records/kind/pattern.md)
- Category: [Structural Patterns](https://banes-lab.com/ontology/principles/architecture-category-structural-patterns.md)
- Severity: [contextual](https://banes-lab.com/records/vocabulary/severity-contextual.md)
- Scope: structure, memory, sharing
- Layer: [Design Patterns Core](https://banes-lab.com/records/layer/design-patterns-core.md)

Details

Definition
A design pattern that shares one copy of immutable intrinsic state among many objects, each keeping only its own extrinsic state.

Requires
[Separable Intrinsic State](https://banes-lab.com/records/lexicon/separable-intrinsic-state.md)

Reinforces
[Memory Efficiency](https://banes-lab.com/records/architecture/memory-efficiency.md)

Enables
[Shared Immutable State](https://banes-lab.com/records/lexicon/shared-immutable-state.md), [High-Cardinality Object Reuse](https://banes-lab.com/records/lexicon/high-cardinality-object-reuse.md)

In tension with
[Complexity](https://banes-lab.com/records/lexicon/complexity.md)

Conflicts with
[Per-Instance Duplicate State](https://banes-lab.com/records/lexicon/per-instance-duplicate-state.md)

Tensions
[Flyweight Pattern / Complexity](https://banes-lab.com/records/tension/complexity-flyweight-pattern.md)

Violated by
identical heavy state duplicated across many instances

Detected by
repeated equal intrinsic state across objects

Measured by
duplicate-state memory footprint

Refactored by
Extract Flyweight, Share Intrinsic State

Enforced by
profiling review

Before

```typescript
const icons = foos.map(foo => new FooIcon(foo.position, loadSprite(foo.kind)));
```

After

```typescript
const spriteCache = new Map<string, Sprite>();
function fooSprite(kind: string) {
const cached = spriteCache.get(kind);
if (cached) return cached;
const sprite = loadSprite(kind);
spriteCache.set(kind, sprite);
return sprite;
}
const icons = foos.map(foo => ({ position: foo.position, sprite: fooSprite(foo.kind) }));
```

How it is checked

Checked by
profiling review

Population
Every boundary, wrapper and composite structure that sits between a caller and the objects it uses

Freshness
A verdict stands until the wrapped interface or its callers change

Refusal
The boundary import rule or the conformance test fails a caller that reaches past the structure

Observation
Imports and call sites that cross the structure, read from source

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The structure's interface, which every caller goes through

Depends on
[Separable Intrinsic State](https://banes-lab.com/records/lexicon/separable-intrinsic-state.md), [Memory Efficiency](https://banes-lab.com/records/architecture/memory-efficiency.md), [Shared Immutable State](https://banes-lab.com/records/lexicon/shared-immutable-state.md), [High-Cardinality Object Reuse](https://banes-lab.com/records/lexicon/high-cardinality-object-reuse.md)

Shape it refuses
[Per-Instance Duplicate State](https://banes-lab.com/records/lexicon/per-instance-duplicate-state.md)

## Links to

- [pattern](https://banes-lab.com/records/kind/pattern.md)
- [mandatory](https://banes-lab.com/records/vocabulary/severity-mandatory.md)
- [Design Patterns Core](https://banes-lab.com/records/layer/design-patterns-core.md)
- [Incompatible Interfaces](https://banes-lab.com/records/lexicon/incompatible-interfaces.md)
- [Anti-Corruption Layer](https://banes-lab.com/records/architecture/anti-corruption-layer.md)
- [Replaceability](https://banes-lab.com/records/architecture/replaceability.md)
- [Interoperability](https://banes-lab.com/records/architecture/interoperability.md)
- [Mapping Overhead](https://banes-lab.com/records/lexicon/mapping-overhead.md)
- [Direct External Coupling](https://banes-lab.com/records/lexicon/direct-external-coupling.md)
- [Interface-Based Design](https://banes-lab.com/records/architecture/interface-based-design.md)
- [Adapter Pattern / Mapping Overhead](https://banes-lab.com/records/tension/adapter-pattern-mapping-overhead.md)
- [recommended](https://banes-lab.com/records/vocabulary/severity-recommended.md)
- [Subsystem Complexity](https://banes-lab.com/records/lexicon/subsystem-complexity.md)
- [Encapsulation](https://banes-lab.com/records/architecture/encapsulation.md)
- [Information Hiding](https://banes-lab.com/records/architecture/information-hiding.md)
- [Simplified Access](https://banes-lab.com/records/lexicon/simplified-access.md)
- [Over-Centralization](https://banes-lab.com/records/lexicon/over-centralization.md)
- [Leaky Subsystem API](https://banes-lab.com/records/lexicon/leaky-subsystem-api.md)
- [Facade Pattern / Over-Centralization](https://banes-lab.com/records/tension/facade-pattern-over-centralization.md)
- [contextual](https://banes-lab.com/records/vocabulary/severity-contextual.md)
- [Controlled Access](https://banes-lab.com/records/lexicon/controlled-access.md)
- [Security](https://banes-lab.com/records/lexicon/security.md)
- [Lazy Load](https://banes-lab.com/records/lexicon/lazy-load.md)
- [Authorization](https://banes-lab.com/records/architecture/authorization.md)
- [Remote Stub](https://banes-lab.com/records/lexicon/remote-stub.md)
- [Transparency / Debugging](https://banes-lab.com/records/lexicon/transparency-debugging.md)
- [Direct Access](https://banes-lab.com/records/lexicon/direct-access.md)
- [Proxy Pattern / Transparency / Debugging](https://banes-lab.com/records/tension/proxy-pattern-transparency-debugging.md)
- [Independent Variation Axes](https://banes-lab.com/records/lexicon/independent-variation-axes.md)
- [Composition Over Inheritance](https://banes-lab.com/records/architecture/composition-over-inheritance.md)
- [Implementation Swap](https://banes-lab.com/records/lexicon/implementation-swap.md)
- [Indirection](https://banes-lab.com/records/lexicon/indirection.md)
- [Cartesian Inheritance Explosion](https://banes-lab.com/records/lexicon/cartesian-inheritance-explosion.md)
- [Bridge Pattern / Indirection](https://banes-lab.com/records/tension/bridge-pattern-indirection.md)
- [Design Review](https://banes-lab.com/records/architecture/design-review.md)
- [Common Interface](https://banes-lab.com/records/lexicon/common-interface.md)
- [Open/Closed Principle](https://banes-lab.com/records/architecture/open-closed.md)
- [Composability](https://banes-lab.com/records/architecture/composability.md)
- [Runtime Behavior Extension](https://banes-lab.com/records/lexicon/runtime-behavior-extension.md)
- [Stack Debugging](https://banes-lab.com/records/lexicon/stack-debugging.md)
- [Subclass Explosion](https://banes-lab.com/records/lexicon/subclass-explosion.md)
- [Decorator Pattern / Stack Debugging](https://banes-lab.com/records/tension/decorator-pattern-stack-debugging.md)
- [Uniform Component Interface](https://banes-lab.com/records/lexicon/uniform-component-interface.md)
- [Uniform Interface](https://banes-lab.com/records/architecture/uniform-interface.md)
- [Recursive Composition](https://banes-lab.com/records/lexicon/recursive-composition.md)
- [Leaf/Composite Transparency](https://banes-lab.com/records/lexicon/leaf-composite-transparency.md)
- [Type Safety](https://banes-lab.com/records/architecture/type-safety.md)
- [Leaf-vs-Container Special-Casing](https://banes-lab.com/records/lexicon/leaf-vs-container-special-casing.md)
- [Composite Pattern / Type Safety](https://banes-lab.com/records/tension/composite-pattern-type-safety.md)
- [Separable Intrinsic State](https://banes-lab.com/records/lexicon/separable-intrinsic-state.md)
- [Memory Efficiency](https://banes-lab.com/records/architecture/memory-efficiency.md)
- [Shared Immutable State](https://banes-lab.com/records/lexicon/shared-immutable-state.md)
- [High-Cardinality Object Reuse](https://banes-lab.com/records/lexicon/high-cardinality-object-reuse.md)
- [Complexity](https://banes-lab.com/records/lexicon/complexity.md)
- [Per-Instance Duplicate State](https://banes-lab.com/records/lexicon/per-instance-duplicate-state.md)
- [Flyweight Pattern / Complexity](https://banes-lab.com/records/tension/complexity-flyweight-pattern.md)

## Linked from

- [The layer topology](https://banes-lab.com/ontology/schema/the-layer-topology.md)
- [The membership](https://banes-lab.com/ontology/schema/the-membership.md)
