NOTE

Decorator Pattern

The decorator pattern adds new functionality to a class or function without changing the original code, with Java and Go examples.

Software Architecture & EngineeringCreated Updated 1 min readhistorical

This is a historical learning note and may contain outdated or incomplete understanding.

1. Definition

Add new functionality to a class or function without changing the original code.

I enhance my own business functionality.

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("*******************");

        // Add swimming functionality
        Car swimCar = new SwimCar(car);
        swimCar.run();
    }
}

3.2. Original Object

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

3.3. Added Functionality

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("swim");
    }
}

4. Golang

4.1. Original Object

/* Original object */
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. Added Functionality

/* Added functionality */
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. References

Discussion

Sign in with GitHub to comment. Discussions are stored as GitHub Issues.View on GitHub