【设计模式】第11节:结构型模式之“装饰器模式”

一、简介

装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设计的时候,装饰器类需要跟原始类继承相同的抽象类或者接口。

特点:可以灵活拓展新功能,动态添加额外职责。

二、UML类图

请添加图片描述

三、案例

以下案例是咖啡店里卖咖啡,可以只买咖啡,也可以加牛奶、糖等,根据选的调味料的种类来计算最终价格。

package main

import "fmt"

type Coffee interface {	
	Cost() float64
}

type SimpleCoffee struct {	
}

func (SimpleCoffee) Cost() float64 {
	return 2.0
}

type CoffeeDecorator struct {
	coffee Coffee
}

func (cd CoffeeDecorator) Cost() float64 {
	fmt.Println("ok1")
	return cd.coffee.Cost()
}

type MilkDecorator struct {
	CoffeeDecorator
}

func NewMilkDecorator(coffee Coffee) Coffee {
	md := MilkDecorator{}
	md.coffee = coffee	
	return md
}

func (md MilkDecorator) Cost() float64 {	
	return md.coffee.Cost() + 0.5
}

type SugarDecorator struct {
	CoffeeDecorator
}

func NewSugarDecorator(coffee Coffee) Coffee {
	sd := SugarDecorator{}
	sd.coffee = coffee
	return sd
}

func (sd SugarDecorator) Cost() float64 {
	return sd.coffee.Cost() + 0.25
}

func main() {
	coffee := new(SimpleCoffee)
	coffeeWithMilk := NewMilkDecorator(coffee)
	coffeeWithMilkAndSugar := NewSugarDecorator(coffeeWithMilk)
	
	fmt.Println("Coffee cost: ", coffee.Cost())
	fmt.Println("Coffee with milk cost: ", coffeeWithMilk.Cost())
	fmt.Println("Coffee with milk and sugar cost: ", coffeeWithMilkAndSugar.Cost())
}

四、对比

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值