ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

结构性:三. 装饰器模式

2022-03-26 15:04:20  阅读:148  来源: 互联网

标签:int Component 模式 num func Calc 装饰 结构性


装饰器模式是什么

是一种结构型设计模式,它允许你将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。由于目标对象和装饰器遵循同一接口,所以你可以对目标进行多次装饰,最后结果为所有装饰器叠加的行为。

为什么用装饰器模式

需要动态的给一个对象增加功能,并且可以动态的撤销的时候。当系统需要添加新的功能是向主类添加新的字段方法或者逻辑,而新的东西只在某些特殊的情况下才会执行。这个时候装饰模式提供了很好的解决方案。装饰模式把需要添加的功能放在单独的类中,并让这个类包裹它所要装饰的对象。这样就可以在需要是,有选择的按顺序的使用包装功能包装对象。

装饰器模式怎么实现

这里我们的目标对象ConcreteComponent有一个Calc方法。然后MulDecorator和AddDecorator两个装饰器分别来扩展目标对象的功能。

目标
package decorator


type Component interface {
    Calc()int
}

type ConcreteComponent struct{}

func (c *ConcreteComponent) Calc() int {
    return 0
}

MulDecorator装饰器
type MulDecorator struct {
    Component
    num int
}

func WarpMulDecorator(c Component, num int) Component {
    return &MulDecorator{
        Component: c,
        num:       num,
    }
}

func (d *MulDecorator) Calc() int {
    return d.Component.Calc() * d.num
}


AddDecorator装饰器
type AddDecorator struct {
    Component
    num int
}

func WarpAddDecorator(c Component, num int) Component {
    return &AddDecorator{
        Component: c,
        num:       num,
    }
}

func (d *AddDecorator) Calc() int {
    return d.Component.Calc() + d.num
}

调用示例
func main() {

	c := new(ConcreteComponent)
	fmt.Println(c.Calc())

	addDecorator := WarpAddDecorator(c,9)
	fmt.Println(addDecorator.Calc())

	mulDecorator := WarpMulDecorator(addDecorator,6)
	fmt.Println(mulDecorator.Calc())
}
// 结果:
// 0
// 9
// 54

优点

  1. 装饰器是继承有力的补充,在不改变原有对象的情况下动态的给对象扩展功能。
  2. 装饰器模式完全准守开闭原则。

缺点

  1. 装饰器模式会增加更多的类和代码,增加程序的复杂性。

标签:int,Component,模式,num,func,Calc,装饰,结构性
来源: https://www.cnblogs.com/ourongxin/p/16058789.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有