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中“装饰模式”
这是历史学习笔记,可能存在过时或不完整的理解。
1. 定义
不改变原有代码的基础上为类或者函数增加新功能。 我增强我自己的业务功能
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("*******************");
//增加游泳功能
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()
}