AgentSkillsCN

acc-create-strategy

为 PHP 8.5 生成策略模式。通过上下文类、策略接口以及具体实现,打造可互换的算法家族,并附带单元测试。

SKILL.md
--- frontmatter
name: acc-create-strategy
description: Generates Strategy pattern for PHP 8.5. Creates interchangeable algorithm families with context class, strategy interface, and concrete implementations. Includes unit tests.

Strategy Pattern Generator

Creates Strategy pattern infrastructure for interchangeable algorithm families.

When to Use

ScenarioExample
Multiple algorithmsPricing, tax, shipping calculation
Runtime selectionPayment processing based on amount
Avoiding conditionalsReplace switch/if-else chains
Algorithm familiesSorting, 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/

  1. {Name}StrategyInterface.php — Algorithm contract with supports method

Step 2: Generate Concrete Strategies

Path: src/Domain/{BoundedContext}/Strategy/

  1. {Variant1}{Name}Strategy.php — First algorithm implementation
  2. {Variant2}{Name}Strategy.php — Second algorithm implementation
  3. Default{Name}Strategy.php — Fallback implementation

Step 3: Generate Resolver

Path: src/Domain/{BoundedContext}/Strategy/

  1. {Name}StrategyResolver.php — Strategy selection logic

Step 4: Generate Service (Optional)

Path: src/Domain/{BoundedContext}/Strategy/

  1. {Name}Service.php — Facade using resolver

Step 5: Generate Tests

  1. {Variant}{Name}StrategyTest.php — Individual strategy tests
  2. {Name}StrategyResolverTest.php — Resolver tests

File Placement

ComponentPath
Strategy Interfacesrc/Domain/{BoundedContext}/Strategy/
Concrete Strategiessrc/Domain/{BoundedContext}/Strategy/
Resolversrc/Domain/{BoundedContext}/Strategy/
Unit Teststests/Unit/Domain/{BoundedContext}/Strategy/

Naming Conventions

ComponentPatternExample
Interface{Name}StrategyInterfacePricingStrategyInterface
Concrete{Variant}{Name}StrategyBulkPricingStrategy
Context{Name}ContextPricingContext
Resolver{Name}StrategyResolverPricingStrategyResolver
Test{ClassName}TestBulkPricingStrategyTest

Quick Template Reference

Strategy Interface

php
interface {Name}StrategyInterface
{
    public function execute({InputType} $input): {OutputType};
    public function supports({InputType} $input): bool;
}

Concrete Strategy

php
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

php
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

php
// 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

DomainStrategies
PricingRegular, Bulk, Promotional, VIP
ShippingStandard, Express, Free, International
TaxUS, EU, Exempt, Zero-rated
PaymentCredit Card, PayPal, Bank Transfer
DiscountPercentage, Fixed, Buy-One-Get-One

Anti-patterns to Avoid

Anti-patternProblemSolution
Stateful StrategiesSide effectsMake strategies readonly
Fat ContextToo much couplingMinimal context interface
Missing ResolverManual strategy selectionUse resolver pattern
Over-engineeringSingle algorithmDon't use pattern
Leaky AbstractionStrategy-specific typesUse shared interfaces

References

For complete PHP templates and examples, see:

  • references/templates.md — Strategy Interface, Concrete Strategy, Resolver, Context templates
  • references/examples.md — Pricing, Shipping, Tax strategies and tests