﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-java人</title><link>http://www.blogjava.net/javapig/</link><description>爱生活,更爱java!</description><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 05:52:14 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 05:52:14 GMT</pubDate><ttl>60</ttl><item><title>Decorator模式个人理解</title><link>http://www.blogjava.net/javapig/archive/2009/10/12/296704.html</link><dc:creator>爪哇猪</dc:creator><author>爪哇猪</author><pubDate>Mon, 12 Oct 2009 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/javapig/archive/2009/10/12/296704.html</guid><wfw:comment>http://www.blogjava.net/javapig/comments/296704.html</wfw:comment><comments>http://www.blogjava.net/javapig/archive/2009/10/12/296704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javapig/comments/commentRss/296704.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javapig/services/trackbacks/296704.html</trackback:ping><description><![CDATA[首先说说这个模式产生的背景，需求，或者是一直被&lt;&lt;设计模式精解&gt;&gt;里提到的场景。<br />
起初的需求是打印一个订单票据，然后又要求给加上一个抬头和一个脚注，再然后又要求抬头和脚注的数量不止一个。<br />
<br />
其实说一下这个模式在技术上的一些要点：<br />
先上一段&lt;&lt;设计模式精解&gt;&gt;里的代码：<br />
abstract class Component {<br />
&nbsp;&nbsp;&nbsp; public abstract void prtTicket();<br />
}<br />
<br />
class SalesTicket extends Component {<br />
&nbsp;&nbsp; &nbsp;public void prtTicket() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Sales Ticket");<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
<br />
class Decorator extends Component {<br />
&nbsp;&nbsp;&nbsp; private Component myComp;<br />
<br />
&nbsp;&nbsp;&nbsp; public Decorator(Component myC) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myComp = myC;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void prtTicket() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(myComp != null)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myComp.prtTicket();<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
class Header1 extends Decorator {<br />
<br />
&nbsp;&nbsp; &nbsp;public Header1(Component myC) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;super(myC);<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;public void prtTicket() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Header 1");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;super.prtTicket();<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
<br />
class Footer1 extends Decorator {<br />
<br />
&nbsp;&nbsp; &nbsp;public Footer1(Component myC) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;super(myC);<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;public void prtTicket() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;super.prtTicket();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Footer 1");<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
<br />
class Main {<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;new Header1(new Footer1(new SalesTicket())).prtTicket();<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
其中，SalesTicket是被包装的对象，也就是核心功能，Decorator是围绕着这个核心功能所要添加的附加功能的抽象类。每个具体的附加功能类都继承Decorator这个类。这样做有两点意义：<br />
1.因为Decorator是继承或实现了核心功能类所继承或实现的父类，这样通过继承Decorator，使附加功能和核心功能的接口一致。<br />
2.将Decorator类的构造函数定义成只接受一个类型为Component类参数的方法，这样使得附加功能必须找到一个核心功能将其包装，也就是说附加功能类是不能单独存在的，必须含有一个核心功能类。<br />
<br />
扩展：<br />
为Decorator类及其所有子类添加无参构造函数，将Main改写一下：<br />
class Main {<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;new Header1(new Footer1()).prtTicket();<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
这样不包装核心功能可以直接使用附加功能，换句话说，不存在附加功能或核心功能，每个类既可以当附加功能也可以当核心功能。<br />
<br />
最后说一下个人对这个模式的理解：<br />
Decorate，翻译成中文意思是装饰，加了个-or就变成装饰者或者叫装饰器。既然叫装饰器，就是要对需要装饰的东西进行包装，改进，使其功能要比原来更多更好，而且既然是装饰，那就肯定不是主要的，核心的功能，只不过是锦上添花而已，不能喧宾夺主。比如说，原本一台好好的打印机，经过装饰后变成了一
台&#8220;可以打印的&#8221;洗衣机，这花添的就大了点，虽说原来的功能还保留着，但是我想这应该不是这个模式提出者的初衷。<br />
<br />
<img src ="http://www.blogjava.net/javapig/aggbug/296704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javapig/" target="_blank">爪哇猪</a> 2009-10-12 16:50 <a href="http://www.blogjava.net/javapig/archive/2009/10/12/296704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>