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
}