1. 设计模式【装饰器模式】

动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活

1.1. php 实现

    ## 定义接口
    interface Component{
        public function operation();
    }

    class ConcreteComponent implements Component{
        public function operation(){
            echo "face" . PHP_EOL;
        }
    }
    ## 定义抽象类 方便后续子类继承
    abstract class Decorator implements Component{
        protected $component;
        public function __construct(Component $component){
            $this->component = $component;
        }
    }
    ## 装饰子类实现
    class ConcreteDecoratorA extends Decorator{
        public $addedState = 1; 
        public function operation(){
            echo $this->component->operation().$this->addedState. PHP_EOL;
        }
    }
    class ConcreteDecoratorB extends Decorator{
         public $addedState = 2; 
        public function operation(){
        echo $this->component->operation().$this->addedState. PHP_EOL;}
    }
    $component = new ConcreteComponent(); // face
    $component = new ConcreteDecoratorA($component2); // face 1
    $component = new ConcreteDecoratorB($component2); // face 1 2
    $component->operation();

1.2. Go 实现

    package main

    import (
        "fmt"
        "log"
    )

    type Component interface {
        Calc() int
    }

    type ConcreteComponent struct{}

    func (*ConcreteComponent) Calc() int {
        log.Println("base")
        return 0
    }

    type MulDecorator struct {
        Component
        num int
    }

    func WarpMulDecorator(c Component, num int) Component {
        return &MulDecorator{
            Component: c,
            num:       num,
        }
    }
    func (d *MulDecorator) Calc() int {
        log.Println("mul")
        return d.Component.Calc() * d.num
    }
    type AddDecorator struct {
        Component
        num int
    }
    func WarpAddDecorator(c Component, num int) Component {
        return &AddDecorator{
            Component: c,
            num:       num,
        }
    }
    func (d *AddDecorator) Calc() int {
        log.Println("add")
        return d.Component.Calc() + d.num
    }
    func main()  {
        var c Component = &ConcreteComponent{}
        c = WarpAddDecorator(c, 10)
        c = WarpMulDecorator(c, 8)
        res := c.Calc()

        fmt.Printf("res %d\n", res)
        // Output:
        // res 80
    }

results matching ""

    No results matching ""