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

一、简介

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

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

二、UML类图

【设计模式】第11节:结构型模式之“装饰器模式”_第1张图片

三、案例

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

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())
}

四、对比

【设计模式】第11节:结构型模式之“装饰器模式”_第2张图片

你可能感兴趣的:(设计模式,装饰器模式)