模式学习(1):Decorator装饰者模式
学习(主要参考 刘艺 delphi模式编程)
概念:Decorator以对客户端透明的方式动态的为对象提供修饰等附加的功能。
使用时机:1、在不影响其他对象的情况下,动态透明的增加责任或功能到某一对象。
2、这些功能可以随时添加或取消;
3、为了增加大量的功能,而导致派生类激增,继承关系复杂而不现实时;累的定义被隐藏或定义不方便派生类的。
模式结构:1、抽象的部件:定义一个接口(类),可以动态附加在其他对象上。抽象虚拟类。(可理解为要实现的功能,当然是类中定义的方法)
TMethod:=class(TObject);
procedure XXX();virtual;Abstract;
end;
2、具体的需要被修饰的部件:被修饰的(类)对象。
TSomething=class(TMethod);
procedure XXX();override;
3、装饰者:定义与抽象部件(1)一致的接口(函数),维护一个到1的引用,以便修饰抽象部件对象的接口。
TDecorateSomething=class(TMethod);
procedure XXX();override;
4、具体装饰者:附加到2上,实现不同的功能效果。
TSomething臭美1=class(TDecorateSomething);procedure XXX();override;
TSomething臭美2=class(TDecorateSomething);procedure XXX();override;
类图:
此类图根据刘艺的例子使用modalmaker11制作。
1 unit PicDecorator; 2 3 interface 4 5 uses Windows, Controls, Classes, SysUtils, Forms, Graphics, Dialogs, Jpeg, 6 Extctrls, ComCtrls, Messages; 7 8 type 9 TPicShow = class(TObject) 10 public 11 procedure Display(AWoner: TForm; ImgFile: string); virtual; abstract; 12 end; 13 14 TPic = class(TPicShow) 15 public 16 procedure Display(AWoner: TForm; ImgFile: string); override; 17 end; 18 19 TDecoratedPic = class(TPicShow) 20 private 21 FComponent: TPicShow; 22 public 23 constructor Create(PicShow: TPicShow); 24 procedure Display(AWoner: TForm; ImgFile: string); overload; override; 25 // property Component: TPicShow read FComponent; 26 end; 27 28 TPicWithMusic = class(TDecoratedPic) 29 public 30 destructor Destroy; override; 31 procedure AddMusic; 32 procedure Display(AWoner: TForm; ImgFile: string); override; 33 end; 34 35 TPicWithFrame = class(TDecoratedPic) 36 private 37 FAddedFrame: Integer; 38 public 39 destructor Destroy; override; 40 procedure Display(AWoner: TForm; ImgFile: string); override; 41 end; 42 43 implementation 44 45 { 46 ************************************* TPic ************************************* 47 } 48 procedure TPic.Display(AWoner: TForm; ImgFile: string); 49 var 50 Img: TImage; 51 begin 52 Img := TImage.Create(AWoner); 53 Img.Picture.LoadFromFile(ImgFile); 54 Img.AutoSize := true; 55 Img.Stretch := true; 56 AWoner.Width := Img.Width + 32; 57 AWoner.Height := Img.Height + 64; 58 AWoner.Caption := ImgFile; 59 Img.Left := 11; 60 Img.Top := 13; 61 Img.Parent := AWoner; 62 end; 63 64 { 65 ******************************** TDecoratedPic ********************************* 66 } 67 constructor TDecoratedPic.Create(PicShow: TPicShow); 68 begin 69 self.FComponent := PicShow; 70 end; 71 72 procedure TDecoratedPic.Display(AWoner: TForm; ImgFile: string); 73 begin 74 if FComponent <> nil then 75 begin 76 FComponent.Display(AWoner, ImgFile); 77 end; 78 end; 79 80 { 81 ******************************** TPicWithMusic ********************************* 82 } 83 destructor TPicWithMusic.Destroy; 84 begin 85 // 结束播放,sndPlaySOund(nil,snd_noDefault); 86 showmessage('Over Music'); 87 if FComponent <> nil then 88 FComponent.Free; 89 end; 90 91 procedure TPicWithMusic.AddMusic; 92 begin 93 // 添加播放的音乐 94 showmessage('add music'); 95 end; 96 97 procedure TPicWithMusic.Display(AWoner: TForm; ImgFile: string); 98 begin 99 inherited Display(AWoner, ImgFile);100 AddMusic;101 end;102 103 {104 ******************************** TPicWithFrame *********************************105 }106 destructor TPicWithFrame.Destroy;107 begin108 if FComponent <> nil then109 FComponent.Free;110 end;111 112 procedure TPicWithFrame.Display(AWoner: TForm; ImgFile: string);113 var114 FrmOut:TBevel;115 FrmIn:TBevel;116 begin117 inherited Display(AWOner,imgfile);118 FrmIn:=TBevel.Create(AWoner);119 FrmIn.Parent:=AWoner;120 frmin.Width:=AWoner.Width-30;121 frmin.Height:=AWOner.Height-62;122 frmin.Left:=10;123 frmin.Top:=12;124 frmin.Shape:=bsBox;125 frmin.Style:=bsLowered;126 127 frmout:=TBevel.Create(AWOner);128 Frmout.Parent:=AWoner;129 frmout.Width:=AWoner.Width-18;130 frmout.Height:=AWOner.Height-48;131 frmout.Left:=4;132 frmout.Top:=6;133 frmout.Shape:=bsBox;134 frmout.Style:=bsraised;135 end;136 137 end.
1 unit Unit3; 2 3 interface 4 5 uses 6 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.FileCtrl; 8 9 type10 TForm3 = class(TForm)11 DirectoryListBox1: TDirectoryListBox;12 DriveComboBox1: TDriveComboBox;13 Edit1: TEdit;14 Panel1: TPanel;15 FileListBox1: TFileListBox;16 FilterComboBox1: TFilterComboBox;17 Button1: TButton;18 Button2: TButton;19 RadioGroup1: TRadioGroup;20 Bevel1: TBevel;21 Image1: TImage;22 procedure Button1Click(Sender: TObject);23 procedure Button2Click(Sender: TObject);24 procedure Edit1KeyPress(Sender: TObject; var Key: Char);25 procedure FileListBox1Click(Sender: TObject);26 private27 { Private declarations }28 imgfilename:string;29 public30 { Public declarations }31 end;32 33 var34 Form3: TForm3;35 36 implementation37 uses PicDecorator;38 {$R *.dfm}39 40 procedure TForm3.Button1Click(Sender: TObject);41 var42 decopic:TPicShow;43 currfrm:TForm;44 begin45 currfrm:=TForm.Create(nil);46 case self.RadioGroup1.ItemIndex of47 0: decopic:=TPicwithframe.Create(Tpic.Create);48 1: decopic:=TPicwithMusic.Create(Tpic.Create);49 2: ;50 end;51 try52 decopic.Display(currfrm,imgfilename);53 currfrm.ShowModal;54 55 finally56 decopic.Free;57 currfrm.Free;58 end;59 end;60 61 procedure TForm3.Button2Click(Sender: TObject);62 begin63 close;64 end;65 66 procedure TForm3.Edit1KeyPress(Sender: TObject; var Key: Char);67 begin68 if key=#13 then69 begin70 filelistbox1.ApplyFilePath(edit1.Text);71 key:=#0;72 end;73 end;74 75 procedure TForm3.FileListBox1Click(Sender: TObject);76 var77 fileExt:string[4];78 begin79 fileExt:=ansiUppercase(ExtractfileExt(filelistbox1.FileName));80 self.Button1.Enabled:=false;81 if (fileExt='.JPG') then82 begin83 self.Image1.Picture.LoadFromFile(filelistbox1.FileName);84 imgfilename:=filelistbox1.FileName;85 button1.Enabled:=true;86 end;87 88 end;89 90 end.
代码为实现的例子。
转载于:https://www.cnblogs.com/acuier/archive/2012/02/17/2355164.html
模式学习(1):Decorator装饰者模式相关推荐
- 零基础学习设计模式之装饰器模式(配套视频)
零基础学习设计模式之装饰器模式 定义 在不改变目标结构的情况下,动态的给对象增加功能 举例 如房子装修.相片加相框等,都是装饰器模式. 基本组件 抽象构件(Component)角色:定义一个抽象接口以 ...
- Java —— Decorator 装饰器模式
文章目录 Java -- Decorator 装饰器模式 简介 用处 简单例子 结构 代码 涉及角色 相关的设计模式 应用实例 优点 缺点 使用场景 注意事项 代码 Java -- Decorator ...
- 设计模式:Decorator(装饰者模式)
Decorator(装饰者模式) 装饰模式的定义与特点 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式 ...
- 研磨设计模式学习笔记之装饰器模式
1.装饰器模式定义:动态地给一个对象添加一些额外的功能职责,就增加功能来说,装饰器模式要比生成子类更加灵活. 2.装饰器模式实现:在装饰器模式的实现中,为了能够实现和原来使用被装饰对象的代码无缝隙结合 ...
- (转)php-cli模式学习(PHP命令行模式)
php-cli模式学习(PHP命令行模式) 之前知道php-cli模式是一种类似shell命令式的执行php程序,不过一直以为这个是一种落后的方式,应该没有什么意义,因为从没有遇到过使用这个cli模式 ...
- python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- 设计模式学习笔记之装饰者模式
装饰者模式 动态的将责任附加到对象上.若要扩展功能,装饰者模式提供了比继承更有弹性的替代方案. 说明: 1.装饰者和被装饰者对象有相同的超类型: 2.可以用一个或者多个装饰者包装一个对象: 3 ...
- 6中结构型设计模式的对比理解(Composite组合模式,Proxy代理模式,Flyweight享元模式,Facade门面模式,Bridge桥接模式,Decorator装饰器模式)
结构型模式 结构型模式用来组装 类和对象,以获得更大的结构. 结构型类模式,通过继承机制来组合接口或类.简单的例子就是多重继承,最后一个类拥有所有父类的性质.这个模式有助于独立开发一个协同类.另一个例 ...
- 装饰器模式java_Java 8的装饰器模式
装饰器模式java 在最近的一篇文章中,我描述了装饰器模式如何挽救了我的一天. 我给出了一个小代码段,其中包含创建装饰器的最简单方法,但承诺Java 8会有更好的方法. 这里是: 用Java 8装饰 ...
- java装饰者模式讲解视频教程_java装饰者模式介绍(图文教程)
java装饰者模式介绍(图文教程).装饰者模式UML类图: 装饰者模式UML类图 java装饰者模式知识要点 装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. ...
最新文章
- 选什么专业,最容易拿下互联网大厂 Offer?三个支付宝新人来支招
- 数据分析系列精彩浓缩(二)
- 2.3.NLTK工具包安装、分词、Text对象、停用词、过滤掉停用词、词性标注、分块、命名实体识别、数据清洗实例、参考文章
- Windows桌面任务栏透明化
- soa示例_SOA示例应用程序
- LintCode 1690. 朋友推荐(二分插入)
- 如何利用 JConsole观察分析Java程序的运行,进行排错调优(转)
- 使用 Fiddler 调试 心知天气,stm32 esp8266获取天气api
- 记录——《C Primer Plus (第五版)》第十一章编程练习第一题
- Proteus8.10软件安装教程
- 饭卡可以用水冲洗吗_关于饭卡使用与管理的规定
- PyQt5实现软键盘
- C语言之编程规范及细节知识(学C必看)
- 小程序发布上线流程_微信小程序发布流程
- 【组合数学】指数型母函数(多重集排列问题)
- mysql 标识列是什么,mysql中标识列是什么意思有什么用
- python中列表常用方法
- 大白话5分钟带你走进人工智能-第七节梯度下降之梯度概念和梯度迭代过程(2)
- win10系统更新服务器太慢了,win10升级太慢咋办?win10升级太慢原因及技巧介绍
- 普通职场人,35岁以后失业怎么办?这是我见过最真诚的建议
热门文章
- PyTorch 1.3发布!能在移动端部署,支持Colab云TPU,阿里云上也能用
- Anime4K:目前最热的开源实时动漫放大算法,Github上一周收获2600星!
- 何恺明随机连接神经网络复现
- 新华三的背景_智能联接,新华三在重新勾勒拓扑图
- python教程-做个淘宝双十一满减攻略
- 一个Python爬虫案例让你看清Python2和3之间的区别
- 工作10以上老程序员都去哪了?作为新时代的程序员我们该何去何从
- 网页版深度学习模型编辑器,搭建运行样样都行,还能3D可视化
- java后端技术路线_Java后端精选技术:Java的反射机制
- html 不显示null,如果model.entity为null,则不显示/写特定的html