NOTE
Decorator Pattern
The decorator pattern adds new functionality to a class or function without changing the original code, with Java and Go examples.
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
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()
}
Discussion
Sign in with GitHub to comment. Discussions are stored as GitHub Issues.View on GitHub