设计模式实例(Lua)笔记之七(Decorator模式)
1.描写叙述
就说说"我"上小学的的糗事吧。
我上小学的时候学习成绩非常的差,班级上 40 多个同学,我基本上都是在排名 45 名以后,依照老师给我的定义就是“不是读书的料”,可是我老爸管的非常严格,明知道我不是这块料,还是往赶鸭子上架,每次考试完成我都是战战兢兢的,“竹笋炒肉”是肯定少不了的,能少点就少点吧,肉可是自己的呀。
四年级期末考试考完,学校出来个非常损的招儿(这招儿如今非常流行的),打印出成绩单,要家长签字,然后才干上五年级,我那个恐惧呀,只是也就是几秒钟的时间,玩起来什么都忘记了。当时。我的成绩(语文 62 数学65 体育 98 自然 63),你要知道在小学低于 90 分基本上就是中下等了,唉,爱学习的人太多了!怎么着,那我把这个成绩单给老爸看看?
就这成绩还要我签字?
!老爸就開始找笤帚,我的屁股已经做好了准备,肌肉要绷紧,要不那个太疼了!哈哈,幸运的是,这个不是当时的真实情况,我没有直接把成绩单交给老爸,而是在交给他之前做了点技术工作,我要把成绩单封装一下,封装分类两步走:
第一步:跟老爸说各个科目的最高分,语文最高是 75,数学是 78,自然是 80,然老爸觉的我成绩与最高分数相几乎相同,这个是实情,可是不知道是什么原因,反正期末考试都考的不怎么样,可是基本上都集中在 70 分以上,我这 60 多分基本上还是垫底的角色;
第二步:在老爸看成绩单后,告诉他我是排名第 38 名,全班,这个也是实情,为啥呢?
有将近十个同学退学了!这个情况我是不说的。不知道是不是当时第一次发成绩单,学校没有考虑清楚,没有写上总共同拥有多少同学,排名第几名等等,反正是被我钻了个空子。类图例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmV4dWVmZW5neWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
2.代码
require "class" --------ISchoolReport-------
ISchoolReport = class() function ISchoolReport:Report() end function ISchoolReport:Sign(name) end --------FouthGradeSchoolReport-------
FouthGradeSchoolReport = class(ISchoolReport) function FouthGradeSchoolReport:Report()
print("----------FouthGradeSchoolReport:Report-----------")
print("尊敬的XXX家长:")
print(".......")
print("语文62 数学65 体育98 自然63")
print(".......")
print(" 家长签名:")
end function FouthGradeSchoolReport:Sign(name)
print("家长签名为:", name)
end --------ReportDecorator-------
ReportDecorator = class(ISchoolReport) function ReportDecorator:ctor(psr)
self.m_pSchoolReport = psr
end function ReportDecorator:IReport()
print("----------ReportDecorator:IReport-----------")
self.m_pSchoolReport:Report()
end function ReportDecorator:Sign(name)
self.m_pSchoolReport:Sign(name)
end --------HighScoreDecorator-------
HighScoreDecorator = class(ReportDecorator) function HighScoreDecorator:Report()
print("----------HighScoreDecorator:Report-----------")
self:ReportHighScore()
self:IReport()
end function HighScoreDecorator:ReportHighScore()
print("这次考试语文最高是75, 数学是78, 自然是80")
end --------SortDecorator-------
SortDecorator = class(ReportDecorator) function SortDecorator:ReportSort()
print("我是排名第38名...")
end function SortDecorator:Report()
print("----------SortDecorator:Report-----------")
self:IReport()
self:ReportSort()
end --------test-------
function DoIt()
local psr = FouthGradeSchoolReport.new()
psr:Report()
psr:Sign("老三")
end function DoNew()
print("----------分部分进行装饰----------")
local psr = FouthGradeSchoolReport.new() -- 原装成绩单
local pssr = SortDecorator.new(psr) -- 又加了成绩排名的说明
local phsr = HighScoreDecorator.new(pssr) -- 加了最高分说明的成绩单 phsr:Report()
phsr:Sign("老三")
end --- main ---
function main()
--DoIt()
DoNew()
end main()
执行结果:
设计模式实例(Lua)笔记之七(Decorator模式)的更多相关文章
- 《图解设计模式》读书笔记5-2 decorator模式
目录 代码演示 模式的角色和类图 思路拓展 Decorator模式即装饰器模式,就是对类进行装饰,下面通过代码说明. 代码演示 代码展示的内容 有一个类StringDisplay:表示一句话,比如he ...
- 设计模式实例(Lua)笔记之四(Builder 模式)
1.描写叙述: 又是一个周三,快要下班了,老大突然又拉住我,喜滋滋的告诉我"牛叉公司非常惬意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我我们公司制作了,只是这次又 ...
- 设计模式实例(Lua)笔记之五(Bridge模式)
1.描写叙述 今天我要说说我自己,梦想中的我自己,我身价过亿,有两个大公司,一个是房地产公司,一个是服装制造业,这两个公司都非常赚钱,天天帮我在累加財富,事实上是什么公司我倒是不关心,我关心的是是不是 ...
- 设计模式实例(Lua)笔记之六(Adapter模式)
1.描写叙述 "我"在 2004 年的时候带了一个项目,做一个人力资源管理,该项目是我们总公司发起的项目,公司一共同拥有 700 多号人,包含子公司,这个项目还是比較简单的,分为三 ...
- 设计模式(十二)Decorator模式
Decorator模式就是不断地为对象添加装饰的设计模式.以蛋糕为例,程序中的对象就相当于蛋糕,然后像不断地装饰蛋糕一样地不断地对其增加功能,它就变成了使用目的更加明确的对象. 首先看示例程序的类图. ...
- 《图解设计模式》读书笔记9-2 Proxy模式
目录 Proxy模式 示例程序 程序描述 类图 程序 角色和类图 角色 模式类图 思路拓展 提升速度 代理与委托 Http代理 与其他模式的关联 Decorator模式 Proxy模式 Proxy是代 ...
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合. 看代码: 7.1.解释 main(),女 ...
- 《Head First 设计模式》学习笔记——适配器模式 + 外观模式
在ADO.NET中.对于我们从数据库中取出的数据都要放到一个DataSet中,无论你是Access的数据库,还是SQL的数据库,或者是Oracle的数据库都要放到DataSet中..NET中并没有提供 ...
- 设计模式C++描述----10.装饰(Decorator)模式
一. 举例 我之前做过一个文件系统就叫 MyFileSys 吧,后来的话,客户想加入一些附加功能,比如压缩.加密.杀毒之类的操作,这些附加操作没有先后顺序,比如你可以先压缩再加密,也可以先杀毒再压缩, ...
随机推荐
- T4系列文章之2:T4工具简介、调试以及T4运行原理
一.前言 经过第一篇,我想大家现在对T4有了基本的印象,应该对T4有了一个大致的了解吧.现在,我们接着来讲一下T4的工具,然后下一篇我就开始T4的用法了.各位客官,就等了. 二.工具介绍 2.1 上图 ...
- ym——物联网入口之中的一个Android蓝牙4.0
转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 假设还有同学不知道蓝牙4.0能够做什么请查看Android+蓝牙 4.0 将带来什么? ...
- 命令模式之2 Invoker Vs. Client
当程序中直接编写下达命令的语句如new Cmd1().execute()时.一般会将调用者与客户类合二为一. 在GUI程序中.下达命令的语句通常包括在底层框架中.或者说底层框架包括了调用者.这时程序猿 ...
- CCDirector导演类
CCDirector类是Cocos2D-x游戏引擎的核心.它用来创建而且控制着屏幕的显示,同一时候控制场景的显示时间和显示方式. 在整个游戏里一般仅仅有一个导演.游戏的開始.结束.暂停都会调用CCDi ...
- 【转】如何在Mac 终端升级ruby版本
原文网址:https://segmentfault.com/a/1190000003784636 rvm是什么?为什么要安装rvm呢,因为rvm可以让你拥有多个版本的Ruby,并且可以在多个版本之间自 ...
- JavaScript-Tool:md5.js
ylbtech-JavaScript-Tool:md5.js 1.返回顶部 1.md5.js /* CryptoJS v3.1.2 code.google.com/p/crypto-js (c) 20 ...
- Java-MyBatis-3.0:MyBatis 3 简介
ylbtech-Java-MyBatis-3.0:MyBatis 3 简介 1.返回顶部 1. 简介 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程 ...
- React中多行文本省略不生效原因
在普通的前端项目中,在不考虑兼容问题的时候,可以用以下代码实现: overflow : hidden; text-overflow: ellipsis; display: -webkit-box; - ...
- C++中的pair,make_pair学习
std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型.例如std::pair<int,float> 或者 std::pair<double,do ...
- DirectUI界面编程(二)绘制一个按钮
上节介绍了使用源码方式构建Duilib应用的项目配置,并创建了一个最简单的基于Duilib库的窗口,细心的读者会发现,当我们点击窗口的关闭按钮时,应用并没有真的退出,因为我们并没有对窗口事件进行处理, ...