学习(主要参考 刘艺 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制作。

View Code

  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.

View Code

 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装饰者模式相关推荐

  1. 零基础学习设计模式之装饰器模式(配套视频)

    零基础学习设计模式之装饰器模式 定义 在不改变目标结构的情况下,动态的给对象增加功能 举例 如房子装修.相片加相框等,都是装饰器模式. 基本组件 抽象构件(Component)角色:定义一个抽象接口以 ...

  2. Java —— Decorator 装饰器模式

    文章目录 Java -- Decorator 装饰器模式 简介 用处 简单例子 结构 代码 涉及角色 相关的设计模式 应用实例 优点 缺点 使用场景 注意事项 代码 Java -- Decorator ...

  3. 设计模式:Decorator(装饰者模式)

    Decorator(装饰者模式) 装饰模式的定义与特点 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式 ...

  4. 研磨设计模式学习笔记之装饰器模式

    1.装饰器模式定义:动态地给一个对象添加一些额外的功能职责,就增加功能来说,装饰器模式要比生成子类更加灵活. 2.装饰器模式实现:在装饰器模式的实现中,为了能够实现和原来使用被装饰对象的代码无缝隙结合 ...

  5. (转)php-cli模式学习(PHP命令行模式)

    php-cli模式学习(PHP命令行模式) 之前知道php-cli模式是一种类似shell命令式的执行php程序,不过一直以为这个是一种落后的方式,应该没有什么意义,因为从没有遇到过使用这个cli模式 ...

  6. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  7. 设计模式学习笔记之装饰者模式

    装饰者模式     动态的将责任附加到对象上.若要扩展功能,装饰者模式提供了比继承更有弹性的替代方案. 说明: 1.装饰者和被装饰者对象有相同的超类型: 2.可以用一个或者多个装饰者包装一个对象: 3 ...

  8. 6中结构型设计模式的对比理解(Composite组合模式,Proxy代理模式,Flyweight享元模式,Facade门面模式,Bridge桥接模式,Decorator装饰器模式)

    结构型模式 结构型模式用来组装 类和对象,以获得更大的结构. 结构型类模式,通过继承机制来组合接口或类.简单的例子就是多重继承,最后一个类拥有所有父类的性质.这个模式有助于独立开发一个协同类.另一个例 ...

  9. 装饰器模式java_Java 8的装饰器模式

    装饰器模式java 在最近的一篇文章中,我描述了装饰器模式如何挽救了我的一天. 我给出了一个小代码段,其中包含创建装饰器的最简单方法,但承诺Java 8会有更好的方法. 这里是: 用Java 8装饰 ...

  10. java装饰者模式讲解视频教程_java装饰者模式介绍(图文教程)

    java装饰者模式介绍(图文教程).装饰者模式UML类图: 装饰者模式UML类图 java装饰者模式知识要点 装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. ...

最新文章

  1. 选什么专业,最容易拿下互联网大厂 Offer?三个支付宝新人来支招
  2. 数据分析系列精彩浓缩(二)
  3. 2.3.NLTK工具包安装、分词、Text对象、停用词、过滤掉停用词、词性标注、分块、命名实体识别、数据清洗实例、参考文章
  4. Windows桌面任务栏透明化
  5. soa示例_SOA示例应用程序
  6. LintCode 1690. 朋友推荐(二分插入)
  7. 如何利用 JConsole观察分析Java程序的运行,进行排错调优(转)
  8. 使用 Fiddler 调试 心知天气,stm32 esp8266获取天气api
  9. 记录——《C Primer Plus (第五版)》第十一章编程练习第一题
  10. Proteus8.10软件安装教程
  11. 饭卡可以用水冲洗吗_关于饭卡使用与管理的规定
  12. PyQt5实现软键盘
  13. C语言之编程规范及细节知识(学C必看)
  14. 小程序发布上线流程_微信小程序发布流程
  15. 【组合数学】指数型母函数(多重集排列问题)
  16. mysql 标识列是什么,mysql中标识列是什么意思有什么用
  17. python中列表常用方法
  18. 大白话5分钟带你走进人工智能-第七节梯度下降之梯度概念和梯度迭代过程(2)
  19. win10系统更新服务器太慢了,win10升级太慢咋办?win10升级太慢原因及技巧介绍
  20. 普通职场人,35岁以后失业怎么办?这是我见过最真诚的建议

热门文章

  1. PyTorch 1.3发布!能在移动端部署,支持Colab云TPU,阿里云上也能用
  2. Anime4K:目前最热的开源实时动漫放大算法,Github上一周收获2600星!
  3. 何恺明随机连接神经网络复现
  4. 新华三的背景_智能联接,新华三在重新勾勒拓扑图
  5. python教程-做个淘宝双十一满减攻略
  6. 一个Python爬虫案例让你看清Python2和3之间的区别
  7. 工作10以上老程序员都去哪了?作为新时代的程序员我们该何去何从
  8. 网页版深度学习模型编辑器,搭建运行样样都行,还能3D可视化
  9. java后端技术路线_Java后端精选技术:Java的反射机制
  10. html 不显示null,如果model.entity为null,则不显示/写特定的html