acc-create-strategy
Strategy Pattern Generator
Creates Strategy pattern infrastructure for interchangeable algorithm families.
When to Use
| Scenario | Example |
|---|---|
| Multiple algorithms | Pricing, tax, shipping calculation |
| Runtime selection | Payment processing based on amount |
| Avoiding conditionals | Replace switch/if-else chains |
| Algorithm families | Sorting, compression, encryption |
Component Characteristics
StrategyInterface
- Defines algorithm contract
- Single method for execution
- Supports method for selection
Strategy Resolver
- Resolves appropriate strategy
- Based on input criteria
- Falls back to default
Concrete Strategies
- Implement specific algorithms
- Interchangeable via interface
- Encapsulate algorithm details
Generation Process
Step 1: Generate Strategy Interface
Path: src/Domain/{BoundedContext}/Strategy/
{Name}StrategyInterface.php— Algorithm contract with supports method
Step 2: Generate Concrete Strategies
Path: src/Domain/{BoundedContext}/Strategy/
{Variant1}{Name}Strategy.php— First algorithm implementation{Variant2}{Name}Strategy.php— Second algorithm implementationDefault{Name}Strategy.php— Fallback implementation
Step 3: Generate Resolver
Path: src/Domain/{BoundedContext}/Strategy/
{Name}StrategyResolver.php— Strategy selection logic
Step 4: Generate Service (Optional)
Path: src/Domain/{BoundedContext}/Strategy/
{Name}Service.php— Facade using resolver
Step 5: Generate Tests
{Variant}{Name}StrategyTest.php— Individual strategy tests{Name}StrategyResolverTest.php— Resolver tests
File Placement
| Component | Path |
|---|---|
| Strategy Interface | src/Domain/{BoundedContext}/Strategy/ |
| Concrete Strategies | src/Domain/{BoundedContext}/Strategy/ |
| Resolver | src/Domain/{BoundedContext}/Strategy/ |
| Unit Tests | tests/Unit/Domain/{BoundedContext}/Strategy/ |
Naming Conventions
| Component | Pattern | Example |
|---|---|---|
| Interface | {Name}StrategyInterface |
PricingStrategyInterface |
| Concrete | {Variant}{Name}Strategy |
BulkPricingStrategy |
| Context | {Name}Context |
PricingContext |
| Resolver | {Name}StrategyResolver |
PricingStrategyResolver |
| Test | {ClassName}Test |
BulkPricingStrategyTest |
Quick Template Reference
Strategy Interface
interface {Name}StrategyInterface
{
public function execute({InputType} $input): {OutputType};
public function supports({InputType} $input): bool;
}
Concrete Strategy
final readonly class {Variant}{Name}Strategy implements {Name}StrategyInterface
{
public function execute({InputType} $input): {OutputType}
{
{algorithmImplementation}
}
public function supports({InputType} $input): bool
{
return {condition};
}
}
Strategy Resolver
final readonly class {Name}StrategyResolver
{
public function __construct(
private iterable $strategies,
private {Name}StrategyInterface $defaultStrategy
) {}
public function resolve({InputType} $input): {Name}StrategyInterface
{
foreach ($this->strategies as $strategy) {
if ($strategy->supports($input)) {
return $strategy;
}
}
return $this->defaultStrategy;
}
}
Usage Example
// Configure strategies
$resolver = new PricingStrategyResolver(
strategies: [
new BulkPricingStrategy(), // 15% off for 100+ items
new PromotionalPricingStrategy(), // Active promotion discount
new VipPricingStrategy(), // VIP customer discount
],
defaultStrategy: new RegularPricingStrategy()
);
// Use in service
$strategy = $resolver->resolve($pricingContext);
$price = $strategy->calculatePrice($pricingContext);
Common Strategy Examples
| Domain | Strategies |
|---|---|
| Pricing | Regular, Bulk, Promotional, VIP |
| Shipping | Standard, Express, Free, International |
| Tax | US, EU, Exempt, Zero-rated |
| Payment | Credit Card, PayPal, Bank Transfer |
| Discount | Percentage, Fixed, Buy-One-Get-One |
Anti-patterns to Avoid
| Anti-pattern | Problem | Solution |
|---|---|---|
| Stateful Strategies | Side effects | Make strategies readonly |
| Fat Context | Too much coupling | Minimal context interface |
| Missing Resolver | Manual strategy selection | Use resolver pattern |
| Over-engineering | Single algorithm | Don't use pattern |
| Leaky Abstraction | Strategy-specific types | Use shared interfaces |
References
For complete PHP templates and examples, see:
references/templates.md— Strategy Interface, Concrete Strategy, Resolver, Context templatesreferences/examples.md— Pricing, Shipping, Tax strategies and tests
More from dykyi-roman/awesome-claude-code
psr-overview-knowledge
PHP Standards Recommendations (PSR) overview knowledge base. Provides comprehensive reference for all accepted PSRs including PSR-1,3,4,6,7,11,12,13,14,15,16,17,18,20. Use for PSR selection decisions and compliance audits.
22detect-code-smells
Detects code smells in PHP codebases. Identifies God Class, Feature Envy, Data Clumps, Long Parameter List, Long Method, Primitive Obsession, Message Chains, Inappropriate Intimacy. Generates actionable reports with refactoring recommendations.
15clean-arch-knowledge
Clean Architecture knowledge base. Provides patterns, antipatterns, and PHP-specific guidelines for Clean Architecture and Hexagonal Architecture audits.
15ddd-knowledge
DDD architecture knowledge base. Provides patterns, antipatterns, and PHP-specific guidelines for Domain-Driven Design audits.
14testing-knowledge
Testing knowledge base for PHP 8.4 projects. Provides testing pyramid, AAA pattern, naming conventions, isolation principles, DDD testing guidelines, and PHPUnit patterns.
12bug-root-cause-finder
Root cause analysis methods for PHP bugs. Provides 5 Whys technique, fault tree analysis, git bisect guidance, and stack trace parsing.
12