NOTE

6.10 装饰器模式

1. 定义 不改变原有代码的基础上为类或者函数增加新功能。 我增强我自己的业务功能 2. uml 3. Java 3.1. client 3.2. 原有对象 3.3. 新增功能 4. Golang 4.1. 原有对象 4.2. 新增功能 4.3. client 5. 参考 - Java中“装饰模式”

Software Architecture & Engineering创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 定义

不改变原有代码的基础上为类或者函数增加新功能。 我增强我自己的业务功能

2. uml

PlantUML 图表

3. Java

3.1. client

public class Client
{
    public static void main(String[] args)
    {
        Car car = new Mycar();
        car.run();

        System.out.println("*******************");

        //增加游泳功能
        Car swimCar = new SwimCar(car);
        swimCar.run();
    }
}

3.2. 原有对象

public interface Car
{
    void run();
}
public class Mycar implements Car
{
    @Override
    public void run()
    {
        System.out.println("my car is running...");
    }
}

3.3. 新增功能

public class CarDecorator implements Car
{
    protected Car car;

    public CarDecorator(Car car)
    {
        this.car = car;
    }

    @Override
    public void run()
    {
        car.run();
    }
}
public class SwimCar extends CarDecorator
{

    public SwimCar(Car car)
    {
        super(car);
    }

    @Override
    public void run()
    {
        this.car.run();
        System.out.println("游泳");
    }
}

4. Golang

4.1. 原有对象

/*原有对象*/
type ICar interface {
	Run()
}

type MyCar struct {
}

func NewMyCar() *MyCar {
	return &MyCar{}
}

func (m MyCar) Run() {
	fmt.Println("I am car, I am running...")
}

4.2. 新增功能

/*新增功能*/
type SwimCar struct {
	car ICar
}

func NewSwimCar(car ICar) *SwimCar {
	return &SwimCar{car: car}
}

func (s SwimCar) Run() {
	s.car.Run()
	fmt.Println("Yes, I can swim...")
}

4.3. client

func main() {
	car := 装饰器.NewMyCar()
	car.Run()

	fmt.Println("============================")

	swimCar := 装饰器.NewSwimCar(car)
	swimCar.Run()
}

5. 参考