学习Go语言之装饰器模式

一,首先理解装饰器模式:动态的给一个对象增加一些额外的职责,这是在软件设计原则上面,一个功能装饰另一个功能,每个功能遵循同一个接口是这个模式的特征。

二,定义对象接口和装饰抽象类

 1 type IDecorate interface {
 2     Do()
 3 }
 4
 5 // 装饰器。实现接口,又定义了自己的事件DecorateFun,相当于抽象类
 6 type Decorate struct {
 7     // 待装饰的抽象类
 8     decorate IDecorate
 9 }
10
11 func (c *Decorate) DecorateFun(i IDecorate) {
12     c.decorate = i
13 }
14
15 func (c *Decorate) Do() {
16     if c.decorate != nil {
17         c.decorate.Do()
18     }
19 }

三,具体的装饰类

 1 // 具体A装饰
 2 type DecorateA struct {
 3     Base Decorate
 4 }
 5
 6 // 重写方法,隐式实现接口
 7 func (c *DecorateA) Do() {
 8     fmt.Printf("执行A装饰")
 9     c.Base.Do()
10 }
11
12 // 具体B装饰
13 type DecorateB struct {
14     Base Decorate
15 }
16
17 // 重写方法,隐式实现接口
18 func (c *DecorateB) Do() {
19     fmt.Printf("执行B装饰")
20     c.Base.Do()
21 }
22
23 // 具体C装饰
24 type DecorateC struct {
25     Base Decorate
26 }
27
28 // 重写方法,隐式实现接口
29 func (c *DecorateC) Do() {
30     fmt.Printf("执行C装饰")
31     c.Base.Do()
32 }

四,客户端调用。此处需要注意避免贪吃蛇无限循环问题

1 func main() {
2     a := new(DecorateA)
3     b := new(DecorateB)
4     c := new(DecorateC)
5     b.Base.DecorateFun(a)
6     c.Base.DecorateFun(b)
7     c.Do()
8 }

原文地址:https://www.cnblogs.com/shi2310/p/11416410.html

时间: 2024-08-30 11:31:18

学习Go语言之装饰器模式的相关文章

java学习笔记-设计模式8(装饰器模式)

意图 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能. public interface Sourceable { public void method(); } public class Source implements Sourceable{ @Override public void method() { System.out.printl

设计模式(八)装饰器模式Decorator(结构型)

设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许

装饰器模式与代理模式比较

当有这样的业务需求的时候——要为写好的代码在目标代码之前或者之后添加部分操作时,此时最笨的方法就是直接在目标代码的前后加上我们需要的功能代码,但是这样违背了java封装的特性.更好一点的方法就是使用设计模式——代理模式,然而,装饰器模式也有同类的功能,那么着两种设计模式到底有什么区别呢?下面就分别来学习一下这两种设计模式. 装饰器模式类图如下: 该类图包括几个部分:一个接口(装饰器与需要被装饰的实体类都需要实现该接口,公用方法在该接口中定义),一个实现类,一个装饰器的接口,具体实现的装饰器. 在

枚举例题源码,反射例题源码,模板与装饰器模式例题源码

枚举例题:package cn.itcast_02; /* * 通过JDK5提供的枚举来做枚举类 */public enum Direction { FRONT, BEHIND, LEFT, RIGHT;} ---------------------------------------package cn.itcast_02; /* * 通过JDK5提供的枚举来做枚举类 */public enum Direction2 { FRONT("前"), BEHIND("后"

javascript装饰器模式

众所周知装饰器模式用于给对象在运行期间动态的增加某个功能,职责等.相较通过继承的方式来扩充对象的功能,装饰器显得更加灵活,首先,我们可以动态给对象选定某个装饰器,而不用hardcore继承对象来实现某个功能点.其次:继承的方式可能会导致子类繁多,仅仅为了增加某一个单一的功能点,显得有些多余了. 装饰器经典实现 首先来看看传统的decorator的实现吧!假设现有一类叫Person 的对象,该对象有个speak 方法.开始的时候Person 的对象只会说中文,现在我要让他说英文,那么可以这么做:

python_装饰器模式

装饰器模式定义:动态地给一个对象添加一些额外的职责. 在Python中Decorator mode可以按照像其它编程语言如C++, Java等的样子来实现,但是Python在应用装饰概念方面的能力上远不止于此,Python提供了一个语法和一个编程特性来加强这方面的功能. 首先需要了解一下Python中闭包的概念:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). def makeblod(fn): def wrapped():

设计模式(三)_装饰器模式

上篇学习了策略模式,现在回想下,什么是策略模式,好了.本篇主要介绍装饰器模式,just do it! 什么是装饰器模式 装饰器模式指的是动态的将责任附加到对象上.若要扩展功能,装饰器模式提供了比继承更弹性的替代方案. 如何使用装饰器模式 老王来到商场买衣服,需要买衣服,裤子,帽子...... public class Wang { public void show(){ System.out.println("我穿上衣服,累计花费100元"); System.out.println(&

Java进阶篇设计模式之五-----外观模式和装饰器模式

前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 简单的来说就是对外提供一个简单接口,隐藏实现的逻辑.比如常用电脑的电源键,我们只需按电源键,就可以让它启动或者关闭,无需知道它是怎么启动的(启动CPU.启动内存.启动硬盘),怎么关闭的(关闭硬盘.关闭内存.关闭CPU)

结构型模式-装饰器模式

对原有对象进行修饰,如有一个篮子,现在对篮子进行修饰,放入苹果,香蕉,橙子 package constructional.pattern.decorator; /* * 创建一个对象的抽象也就是接口 */ public interface Basket { public void show(); } package constructional.pattern.decorator; /** *身份:被装饰的对象 *一个对接口的实现,这个对象表示要我们将来要修饰的篮子里装内容,如果想修饰篮子的造型