首页 > 其他分享 >golang实现设计模式之装饰器模式-优缺点,适用场景

golang实现设计模式之装饰器模式-优缺点,适用场景

时间:2023-06-09 18:25:06浏览次数:46  
标签:getPrice 对象 优缺点 golang 构件 设计模式 装饰 pizza

装饰器模式是一种结构型设计模式,简单概括就是:不改变先有对象结构下,动态给对象增加一些职责。

装饰器模式通过组合方式实现,与继承的异同:

  • 使用继承方式,具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。
  • 使用组合方式,创建装饰对象来装饰真实对象,原对象功能不变,另外扩展。

结构

  • 1.抽象构件(Component)角色。定义一个抽象接口以规范准备接收附加责任的对象。
  • 2.具体构件(ConcreteComponent)角色。被装饰的真实对象,实现抽象构件,通过装饰角色为其添加一些职责。
  • 3.抽象装饰(Decorator)角色(如果有扩展需要)。继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  • 4.具体装饰(ConcreteDecorator)角色。实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

优缺点

  • 优点

1.通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果。
2.装饰器模式完全遵守开闭原则。
3.不改变原对象下,动态给对象增加行为,比继承更灵活。

  • 缺点

1.装饰器模式会增加许多子类,过度使用会增加程序得复杂性。

适用场景

1.给现有类增加职责,又不通过增加子类进行扩充。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。
2.对现有基本功能排列组合产生许多功能,通过继承不好实现,通过装饰器很好实现。
3.当对象的功能要求可以动态地添加,也可以再动态地撤销时。

代码实现

package main

import "fmt"

/*
业务场景:
- 定义披萨,披萨面饼+不同馅料装饰 -> 不同价格
*/

// 1.抽象组件,接口,具体组件和装饰器都要实现该接口
type iPizza interface {
   getPrice() float64
}

// 2.具体组件,声明实际行为
type pizzaBase struct {
   price float64
}

func (r *pizzaBase) getPrice() float64 {
   return r.price
}

// 3.不同装饰器,实际是加不同馅料实现对pizza饼的装饰
type BaconFilling struct {
   pizza iPizza
}

func (r *BaconFilling) getPrice() float64 {
   return r.pizza.getPrice() + 5
}

type CheeseFilling struct {
   pizza iPizza
}

func (r *CheeseFilling) getPrice() float64 {
   return r.pizza.getPrice() + 6
}

// client
func main() {
   pizza := &pizzaBase{3.0}

   // add cheese
   pizzaWithCheese := &CheeseFilling{pizza: pizza}

   // add bacon
   pizzaWithBacon := &BaconFilling{pizza: pizzaWithCheese}

   // calculate total price, 3+5+6
   fmt.Printf("The price of pizza with bacon and cheese is: $ %.2f\n", pizzaWithBacon.getPrice())
}

参考文章:

标签:getPrice,对象,优缺点,golang,构件,设计模式,装饰,pizza
From: https://www.cnblogs.com/davis12/p/17469976.html

相关文章

  • golang实现设计模式之组合模式-优缺点与适用场景
    组合模式是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。结构抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件......
  • golang实现设计模式之代理模式-优缺点,适用场景
    代理模式作为一种结构型的设计模式,因为某种原因,需要对访问的对象通过代理访问目标对象,访问对象不适合或者不能直接引用该目标对象,代理就成为访问对象和目标对象的中介。结构1.抽象主题(Subject)类。通过接口或抽象类声明真实主题和代理对象实现的业务方法。2.真实主题(RealSubje......
  • golang实现设计模式之责任链模式-优缺点,适用场景
    责任链模式是一种行为型的设计模式,也叫职责链,定义:在这样的场景中,请求需要经过一系列的处理者,通过列表或者链表将处理者组合起来,请求依次被处理者处理,如果需要中断,也可以及时退出处理。上述的这种的应用场景,典型的就是在web应用中的中间件或者拦截器,比如Gin框架的中间件。结......
  • golang实现设计模式之策略模式-优缺点,适用场景
    策略模式是一种行为型的设计模式,该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户,或者认为把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。结构1.抽象策略(Strategy)类。定义了一个公共接口,各种不......
  • golang实现设计模式之适配器模式-优缺点,适用场景
    适配器模式是一种结构型设计模式,它是通过接口转换,使得原先接口不被兼容的其他类可以一起工作。类型类结构型特点:-程序耦合性高-要求程序员对组件内部结构熟悉-应用相对少些类适配器模式可以用过继承的方式来实现。对象结构型特点:可重用性较差。对象适配器允许一......
  • golang实现设计模式之观察者模式-优缺点,适用场景
    观察者模式是一种行为型模式,其定义一种订阅机制,可在对象事件发生时通知多个“观察”该对象的其他对象。观察者模式常用订阅/发布机制,即发布者持有所有订阅者,当发布者状态变更或者特定行为时,通知所有订阅者。结构1.发布者。属性及行为:属性,订阅者列表,行为,添加、删除订阅者方......
  • golang实现设计模式之模板模式-优缺点,适用场景
    模板模式是一种行为型设计模式,其定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。特点1.算法结构已确定。2.具体实现交由子类实现。结构1.抽象类(AbstractClass)。算法步骤可以被声明为抽......
  • 基于网卡地址做设备指纹的优缺点
    生成设备指纹的目的是为了能唯一地标识设备,而且这个标识在设备的生命周期内保持稳定。因此,在选择设备特征时,通常需要考虑这些特征的唯一性和稳定性。软件及配置信息一版不适合,是因为这类变化虽然不大,但万一变化后,设备指纹会变,影响使用。比如:操作系统信息:操作系统版本、安装日......
  • 4月29日邓老师设计模式面试资料 一般有用 看1
    【金三银四】设计模式篇1.谈谈你对设计模式的理解1.首先谈设计模式的作用:经验的传承,提高了软件复用的水平,最终达到提高软件开发效率设计原则简单说明单一职责一个类只负责一项职责里氏替换原则子类可以扩展父类的功能,但不能改变父类原有的功能依赖倒置原则要依......
  • 9.3 模版设计模式
    抽象类的设计应该是比类更高一层的设计。抽象类最大好处:1.对子类方法对统一管理;2.可以自身提供有一些普通方法,并且这些普通方法可以调用抽象方法(这些抽象方法必须在有子类提供实现的时候才会生效)abstractclassAction{ //定义公共行为类 publicstaticfinal......