《大话设计模式-Golang》装饰模式

概念

装饰模式(Decorator)动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

需求

给人搭配不同的衣服

UML图

在这里插入图片描述

代码

人类接口

type PersonSuper interface {
	Show()
}

人类实现人类接口

type Person struct {
	Name string
}

func (p Person) Show() {
	fmt.Printf("装扮的%v", p.Name)
	fmt.Println()
}

装饰器类实现人类接口

type Decorator struct {
	Person PersonSuper
}

func (d *Decorator) Show() {}

func (d *Decorator) Decorate(person PersonSuper) {
	d.Person = person
}

衣服类继承装饰器类

type TShirts struct {
	Decorator
}

func (t *TShirts) Show() {
	t.Person.Show()
	fmt.Println("大T恤")
}

func (t *TShirts) Decorate(person PersonSuper) PersonSuper {
	t.Decorator.Decorate(person)
	return &TShirts{
		Decorator{person},
	}
}

type BigTrouser struct {
	Decorator
}

func (b *BigTrouser) Show() {
	b.Person.Show()
	fmt.Println("垮裤")
}

func (b *BigTrouser) Decorate(person PersonSuper) PersonSuper {
	b.Decorator.Decorate(person)
	return &BigTrouser{
		Decorator{person},
	}
}

type Sneakers struct {
	Decorator
}

func (s *Sneakers) Show() {
	s.Person.Show()
	fmt.Println("破球鞋")
}

func (s *Sneakers) Decorate(person PersonSuper) PersonSuper {
	s.Decorator.Decorate(person)
	return &Sneakers{
		Decorator{person},
	}
}
.
.
.
.

测试

xc := decoratorPattern.Person{Name: "小蔡"}
fmt.Println("第一种装扮")
pqx := new(decoratorPattern.Sneakers)
kk := new(decoratorPattern.BigTrouser)
dtx := new(decoratorPattern.TShirts)
pqx.Decorate(xc)
kk.Decorate(pqx)
dtx.Decorate(kk)
dtx.Show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值