开发者模式------装饰模式
来源:互联网 发布:2017知乎用户调查报告 编辑:程序博客网 时间:2024/06/02 08:06
<div id="article_details" class="details">
<div class="article_title">
<span class="ico ico_type_Original"></span>
<h1>
<span class="link_title"><a href="/a19881029/article/details/8980503">
装饰模式(Decorate Pattern)
</a>
</span>
</h1>
</div>
<div class="article_manage clearfix">
<div class="article_l">
<span class="link_categories">
标签:
<a href="http://www.csdn.net/tag/%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">设计模式</a><a href="http://www.csdn.net/tag/%e8%a3%85%e9%a5%b0%e6%a8%a1%e5%bc%8f" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">装饰模式</a>
</span>
</div>
<div class="article_r">
<span class="link_postdate">2013-05-28 17:29</span>
<span class="link_view" title="阅读次数">11284人阅读</span>
<span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(5)</span>
<span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('%e8%a3%85%e9%a5%b0%e6%a8%a1%e5%bc%8f%ef%bc%88Decorate+Pattern%ef%bc%89','8980503');return false;" title="收藏" target="_blank">收藏</a></span>
<span class="link_report"> <a href="#report" onclick="javascript:report(8980503,2);return false;" title="举报">举报</a></span>
</div>
</div> <style type="text/css">
.embody{
padding:10px 10px 10px;
margin:0 -20px;
border-bottom:solid 1px #ededed;
}
.embody_b{
margin:0 ;
padding:10px 0;
}
.embody .embody_t,.embody .embody_c{
display: inline-block;
margin-right:10px;
}
.embody_t{
font-size: 12px;
color:#999;
}
.embody_c{
font-size: 12px;
}
.embody_c img,.embody_c em{
display: inline-block;
vertical-align: middle;
}
.embody_c img{
width:30px;
height:30px;
}
.embody_c em{
margin: 0 20px 0 10px;
color:#333;
font-style: normal;
}
</style>
<script type="text/javascript">
$(function () {
try
{
var lib = eval("("+$("#lib").attr("value")+")");
var html = "";
if (lib.err == 0) {
$.each(lib.data, function (i) {
var obj = lib.data[i];
//html += '<img src="' + obj.logo + '"/>' + obj.name + " ";
html += ' <a href="' + obj.url + '" target="_blank">';
html += ' <img src="' + obj.logo + '">';
html += ' <em><b>' + obj.name + '</b></em>';
html += ' </a>';
});
if (html != "") {
setTimeout(function () {
$("#lib").html(html);
$("#embody").show();
}, 100);
}
}
} catch (err)
{ }
});
</script>
<div class="category clearfix">
<div class="category_l">
<img src="http://static.blog.csdn.net/images/category_icon.jpg">
<span>分类:</span>
</div>
<div class="category_r">
<label onclick="GetCategoryArticles('1400727','a19881029','top','8980503');">
<span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">Design Pattern<em>(19)</em></span>
<img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
<img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
<div class="subItem">
<div class="subItem_t"><a href="http://blog.csdn.net/a19881029/article/category/1400727" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
<ul class="subItem_l" id="top_1400727">
</ul>
</div>
</label>
</div>
</div>
<div class="bog_copyright">
<p class="copyright_p">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>
</div>
<div id="article_content" class="article_content tracking-ad" data-mod="popu_307" data-dsm="post">
<p>装饰模式定义:装饰模式动态的将责任附加到对象上,若要扩展功能,装饰模式提供了比继承更有弹性的替代方案</p>
<p>看下下面的例子,总共有两种咖啡:Decaf、Espresso,另有两种调味品:Mocha、Whip(3种设计的主要差别在于抽象方式不同)</p>
<p><strong>设计一:</strong></p>
<img src="http://img.blog.csdn.net/20150724154701506?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
<p>即使添加在多的调味品,咖啡依然是咖啡,在抽象的过程中并没有考虑咖啡和调味品之间的关系</p>
<p>当咖啡和调味品的种类很多时,将会产生大量的类,如果一种咖啡的价格发生变动,需要找到所有相关的类逐一修改</p>
<p><strong>设计二:</strong></p>
<img src="http://img.blog.csdn.net/20150724160235303?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
<p>将调味品作为Coffee类的属性,比起设计一,类的数量大大减少,相应的,程序结构也更加清晰</p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 1330px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Coffee { </span></span></li><li class=""><span> <span class="keyword">private</span><span> </span><span class="keyword">boolean</span><span> mocha; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> </span><span class="keyword">boolean</span><span> whip; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class=""><span> <span class="keyword">double</span><span> price = 0d; </span></span></li><li class="alt"><span> <span class="keyword">if</span><span>(mocha){ </span></span></li><li class=""><span> price += <span class="number">0.5</span><span>; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="keyword">if</span><span>(whip){ </span></span></li><li class="alt"><span> price += <span class="number">0.1</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">return</span><span> price; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> addMocha(){ </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.mocha = </span><span class="keyword">true</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> addWhip(){ </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.whip = </span><span class="keyword">true</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Coffee {
private boolean mocha;
private boolean whip;
public double cost(){
double price = 0d;
if(mocha){
price += 0.5;
}
if(whip){
price += 0.1;
}
return price;
}
public void addMocha(){
this.mocha = true;
}
public void addWhip(){
this.whip = true;
}
}
</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 1812px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Decaf </span><span class="keyword">extends</span><span> Coffee{ </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class="alt"><span> <span class="keyword">double</span><span> price = </span><span class="keyword">super</span><span>.cost(); </span></span></li><li class=""><span> price += <span class="number">2.0</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> price; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Decaf extends Coffee{
public double cost(){
double price = super.cost();
price += 2.0;
return price;
}
}</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 2006px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Espresso </span><span class="keyword">extends</span><span> Coffee { </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class="alt"><span> <span class="keyword">double</span><span> price = </span><span class="keyword">super</span><span>.cost(); </span></span></li><li class=""><span> price += <span class="number">2.5</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> price; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Espresso extends Coffee {
public double cost(){
double price = super.cost();
price += 2.5;
return price;
}
}</pre>
<p><a href="http://lib.csdn.net/base/softwaretest" class="replace_word" title="软件测试知识库" target="_blank" style="color:#df3434; font-weight:bold;">测试</a>一下:</p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 2244px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Test { </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) { </span></span></li><li class="alt"><span> Coffee coffee = <span class="keyword">new</span><span> Decaf(); </span></span></li><li class=""><span> coffee.addMocha(); </span></li><li class="alt"><span> coffee.addWhip(); </span></li><li class=""><span> <span class="comment">//2.6</span><span> </span></span></li><li class="alt"><span> System.out.println(coffee.cost()); </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Test {
public static void main(String[] args) {
Coffee coffee = new Decaf();
coffee.addMocha();
coffee.addWhip();
//2.6
System.out.println(coffee.cost());
}
}</pre>
<p>考虑到下面几个问题,设计二有明显的不足:</p>
<p>1,如果调味品的种类较多,Coffee类将会变得相当庞大,难以维护</p>
<p>2,无法处理顾客希望添加双倍的Mocha的场景</p>
<p>3,添加一种新的咖啡IceCoffee,从逻辑上来说IceCoffee是不能加Mocha的,但是由于IceCoffee类继承自Coffee类,IceCoffee类依然从父类继承了addMocha()方法,这就需要在IceCoffee类中重写一个空的addMocha()方法,并且当使用IceCoffee类时,不能够面向Coffee类编程,以避免错误的调用父类方法</p>
<p><strong>设计三--装饰器模式:</strong></p>
<img src="http://img.blog.csdn.net/20150724163818712?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
<p>装饰模式分为3个部分:</p>
<p>1,抽象组件 -- 对应Coffee类</p>
<p>2,具体组件 -- 对应具体的咖啡,如:Decaf,Espresso</p>
<p>3,装饰者 -- 对应调味品,如:Mocha,Whip</p>
<p>装饰模式有3个特点:</p>
<p>1,具体组件和装饰者都继承自抽象组件(Decaf、Espresson、Mocha和Whip都继承自Coffee),并且装饰者持有抽象组件的引用</p>
<p>2,可以使用装饰者组合具体组件创造出新的类(Mocha组合Decaf创造出MochaDecaf)</p>
<p>3,过程2可以重复,直到创造出需要的类</p>
<p>使用装饰模式,想要获得一个WhipDoubleMochaEspresso是很容易的:</p>
<img src="http://img.blog.csdn.net/20150724174118284?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 3666px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> Coffee { </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(); </span></span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public interface Coffee {
public double cost();
}</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 3788px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_6" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_6" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=6&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Espresso </span><span class="keyword">implements</span><span> Coffee { </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="number">2.5</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Espresso implements Coffee {
public double cost(){
return 2.5;
}
}</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 3946px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_7" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_7" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=7&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Dressing </span><span class="keyword">implements</span><span> Coffee { </span></span></li><li class=""><span> <span class="keyword">private</span><span> Coffee coffee; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> Dressing(Coffee coffee){ </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.coffee = coffee; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> coffee.cost(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Dressing implements Coffee {
private Coffee coffee;
public Dressing(Coffee coffee){
this.coffee = coffee;
}
public double cost(){
return coffee.cost();
}
}</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 4212px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_8" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_8" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=8&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Whip </span><span class="keyword">extends</span><span> Dressing { </span></span></li><li class=""><span> <span class="keyword">public</span><span> Whip(Coffee coffee){ </span></span></li><li class="alt"><span> <span class="keyword">super</span><span>(coffee); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">super</span><span>.cost() + </span><span class="number">0.1</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Whip extends Dressing {
public Whip(Coffee coffee){
super(coffee);
}
public double cost(){
return super.cost() + 0.1;
}
}</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 4442px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_9" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_9" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=9&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Mocha </span><span class="keyword">extends</span><span> Dressing { </span></span></li><li class=""><span> <span class="keyword">public</span><span> Mocha(Coffee coffee){ </span></span></li><li class="alt"><span> <span class="keyword">super</span><span>(coffee); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">super</span><span>.cost() + </span><span class="number">0.5</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Mocha extends Dressing {
public Mocha(Coffee coffee){
super(coffee);
}
public double cost(){
return super.cost() + 0.5;
}
}</pre>
<p>测试一下:</p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 4716px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_10" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_10" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=10&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Test { </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) { </span></span></li><li class="alt"><span> Coffee coffee = <span class="keyword">new</span><span> Espresso(); </span></span></li><li class=""><span> coffee = <span class="keyword">new</span><span> Mocha(coffee); </span></span></li><li class="alt"><span> coffee = <span class="keyword">new</span><span> Mocha(coffee); </span></span></li><li class=""><span> coffee = <span class="keyword">new</span><span> Whip(coffee); </span></span></li><li class="alt"><span> <span class="comment">//3.6(2.5 + 0.5 + 0.5 + 0.1)</span><span> </span></span></li><li class=""><span> System.out.println(coffee.cost()); </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Test {
public static void main(String[] args) {
Coffee coffee = new Espresso();
coffee = new Mocha(coffee);
coffee = new Mocha(coffee);
coffee = new Whip(coffee);
//3.6(2.5 + 0.5 + 0.5 + 0.1)
System.out.println(coffee.cost());
}
}</pre>
<p>当然Decorator类中可以重写父类的方法,也可以扩展自己需要的方法</p>
<p> </p>
<p><span style="color:#FF0000">装饰模式的缺点:</span></p>
<p>1,装饰模式虽然扩展性较高,但是没有设计二简洁,类的数量略多(但肯定比设计一少很多),如何取舍可扩展性和简洁性是个问题,有所选择就要有所牺牲</p>
<p>2,很难搞清楚一个类究竟被装饰了多少层,可能是1层,也可能是100层</p>
</div>
<!-- Baidu Button BEGIN -->
<div class="bdsharebuttonbox tracking-ad bdshare-button-style0-16" style="float: right;" data-mod="popu_172" data-bd-bind="1500946351034">
<a href="#" class="bds_more" data-cmd="more" style="background-position:0 0 !important; background-image: url(http://bdimg.share.baidu.com/static/api/img/share/icons_0_16.png?v=d754dcc0.png) !important" target="_blank"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间" style="background-position:0 -52px !important" target="_blank"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博" style="background-position:0 -104px !important" target="_blank"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博" style="background-position:0 -260px !important" target="_blank"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网" style="background-position:0 -208px !important" target="_blank"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信" style="background-position:0 -1612px !important" target="_blank"></a>
</div>
<script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script>
<!-- Baidu Button END -->
<!--172.16.140.14-->
<!-- Baidu Button BEGIN -->
<script type="text/javascript" id="bdshare_js" data="type=tools&uid=1536434" src="http://bdimg.share.baidu.com/static/js/bds_s_v2.js?cdnversion=416930"></script>
<script type="text/javascript">
document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
</script>
<!-- Baidu Button END -->
<div id="digg" articleid="8980503">
<dl id="btnDigg" class="digg digg_disable" onclick="btndigga();">
<dt>顶</dt>
<dd>5</dd>
</dl>
<dl id="btnBury" class="digg digg_disable" onclick="btnburya();">
<dt>踩</dt>
<dd>2</dd>
</dl>
</div>
<div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank"> </a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank"> </a></div>
<script type="text/javascript">
function btndigga() {
$(".tracking-ad[data-mod='popu_222'] a").click();
}
function btnburya() {
$(".tracking-ad[data-mod='popu_223'] a").click();
}
</script>
<ul class="article_next_prev">
<li class="prev_article"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian']);location.href='http://blog.csdn.net/a19881029/article/details/8975962';">上一篇</span><a href="http://blog.csdn.net/a19881029/article/details/8975962" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian'])">JDK自带的观察者模式</a></li>
<li class="next_article"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian']);location.href='http://blog.csdn.net/a19881029/article/details/8990655';">下一篇</span><a href="http://blog.csdn.net/a19881029/article/details/8990655" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian'])">JDK中的装饰模式:Java I/O</a></li>
</ul>
<div style="clear:both; height:10px;"></div>
<div class="similar_article">
<h4></h4>
<div class="similar_c" style="margin:20px 0px 0px 0px">
<div class="similar_c_t">
相关文章推荐
</div>
<div class="similar_wrap tracking-ad" data-mod="popu_36">
<ul class="similar_list fl">
<li>
<em>•</em>
<a href="http://blog.csdn.net/a19881029/article/details/8975962" title="JDK自带的观察者模式" strategy="BlogCommendFromBaidu" target="_blank">JDK自带的观察者模式</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/xyjwsj/article/details/55211802" title="Java设计模式(观察者模式JDK自带)" strategy="BlogCommendFromBaidu" target="_blank">Java设计模式(观察者模式JDK自带)</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/coding_man_xie/article/details/49622423" title="java设计模式--装饰者模式(Decorater Pattern)" strategy="BlogCommendFromBaidu" target="_blank">java设计模式--装饰者模式(Decorater Pattern)</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/jason0539/article/details/22713711" title="JAVA设计模式初探之装饰者模式" strategy="BlogCommendFromBaidu" target="_blank">JAVA设计模式初探之装饰者模式</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/lenotang/article/details/2587265" title="装饰模式" strategy="BlogCommendFromBaidu" target="_blank">装饰模式</a>
</li>
</ul>
<ul class="similar_list fr">
<li>
<em>•</em>
<a href="http://blog.csdn.net/lansuiyun/article/details/11714957" title="装饰者模式" strategy="BlogCommendFromBaidu" target="_blank">装饰者模式</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/u012909091/article/details/38665187" title="设计模式——装饰模式(Decorator)" strategy="BlogCommendFromBaidu" target="_blank">设计模式——装饰模式(Decorator)</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/gdutxiaoxu/article/details/51885105" title="装饰者模式及其应用" strategy="BlogCommendFromBaidu" target="_blank">装饰者模式及其应用</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/zhanghongjie0302/article/details/17251413" title="设计模式之装饰者模式" strategy="BlogCommendFromBaidu" target="_blank">设计模式之装饰者模式</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/xdd19910505/article/details/22880469" title="装饰模式 VS. 外观模式" strategy="BlogCommendFromBaidu" target="_blank">装饰模式 VS. 外观模式</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="article_title">
<span class="ico ico_type_Original"></span>
<h1>
<span class="link_title"><a href="/a19881029/article/details/8980503">
装饰模式(Decorate Pattern)
</a>
</span>
</h1>
</div>
<div class="article_manage clearfix">
<div class="article_l">
<span class="link_categories">
标签:
<a href="http://www.csdn.net/tag/%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">设计模式</a><a href="http://www.csdn.net/tag/%e8%a3%85%e9%a5%b0%e6%a8%a1%e5%bc%8f" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">装饰模式</a>
</span>
</div>
<div class="article_r">
<span class="link_postdate">2013-05-28 17:29</span>
<span class="link_view" title="阅读次数">11284人阅读</span>
<span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(5)</span>
<span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('%e8%a3%85%e9%a5%b0%e6%a8%a1%e5%bc%8f%ef%bc%88Decorate+Pattern%ef%bc%89','8980503');return false;" title="收藏" target="_blank">收藏</a></span>
<span class="link_report"> <a href="#report" onclick="javascript:report(8980503,2);return false;" title="举报">举报</a></span>
</div>
</div> <style type="text/css">
.embody{
padding:10px 10px 10px;
margin:0 -20px;
border-bottom:solid 1px #ededed;
}
.embody_b{
margin:0 ;
padding:10px 0;
}
.embody .embody_t,.embody .embody_c{
display: inline-block;
margin-right:10px;
}
.embody_t{
font-size: 12px;
color:#999;
}
.embody_c{
font-size: 12px;
}
.embody_c img,.embody_c em{
display: inline-block;
vertical-align: middle;
}
.embody_c img{
width:30px;
height:30px;
}
.embody_c em{
margin: 0 20px 0 10px;
color:#333;
font-style: normal;
}
</style>
<script type="text/javascript">
$(function () {
try
{
var lib = eval("("+$("#lib").attr("value")+")");
var html = "";
if (lib.err == 0) {
$.each(lib.data, function (i) {
var obj = lib.data[i];
//html += '<img src="' + obj.logo + '"/>' + obj.name + " ";
html += ' <a href="' + obj.url + '" target="_blank">';
html += ' <img src="' + obj.logo + '">';
html += ' <em><b>' + obj.name + '</b></em>';
html += ' </a>';
});
if (html != "") {
setTimeout(function () {
$("#lib").html(html);
$("#embody").show();
}, 100);
}
}
} catch (err)
{ }
});
</script>
<div class="category clearfix">
<div class="category_l">
<img src="http://static.blog.csdn.net/images/category_icon.jpg">
<span>分类:</span>
</div>
<div class="category_r">
<label onclick="GetCategoryArticles('1400727','a19881029','top','8980503');">
<span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">Design Pattern<em>(19)</em></span>
<img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
<img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
<div class="subItem">
<div class="subItem_t"><a href="http://blog.csdn.net/a19881029/article/category/1400727" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
<ul class="subItem_l" id="top_1400727">
</ul>
</div>
</label>
</div>
</div>
<div class="bog_copyright">
<p class="copyright_p">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>
</div>
<div id="article_content" class="article_content tracking-ad" data-mod="popu_307" data-dsm="post">
<p>装饰模式定义:装饰模式动态的将责任附加到对象上,若要扩展功能,装饰模式提供了比继承更有弹性的替代方案</p>
<p>看下下面的例子,总共有两种咖啡:Decaf、Espresso,另有两种调味品:Mocha、Whip(3种设计的主要差别在于抽象方式不同)</p>
<p><strong>设计一:</strong></p>
<img src="http://img.blog.csdn.net/20150724154701506?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
<p>即使添加在多的调味品,咖啡依然是咖啡,在抽象的过程中并没有考虑咖啡和调味品之间的关系</p>
<p>当咖啡和调味品的种类很多时,将会产生大量的类,如果一种咖啡的价格发生变动,需要找到所有相关的类逐一修改</p>
<p><strong>设计二:</strong></p>
<img src="http://img.blog.csdn.net/20150724160235303?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
<p>将调味品作为Coffee类的属性,比起设计一,类的数量大大减少,相应的,程序结构也更加清晰</p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 1330px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Coffee { </span></span></li><li class=""><span> <span class="keyword">private</span><span> </span><span class="keyword">boolean</span><span> mocha; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> </span><span class="keyword">boolean</span><span> whip; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class=""><span> <span class="keyword">double</span><span> price = 0d; </span></span></li><li class="alt"><span> <span class="keyword">if</span><span>(mocha){ </span></span></li><li class=""><span> price += <span class="number">0.5</span><span>; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="keyword">if</span><span>(whip){ </span></span></li><li class="alt"><span> price += <span class="number">0.1</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">return</span><span> price; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> addMocha(){ </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.mocha = </span><span class="keyword">true</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> addWhip(){ </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.whip = </span><span class="keyword">true</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Coffee {
private boolean mocha;
private boolean whip;
public double cost(){
double price = 0d;
if(mocha){
price += 0.5;
}
if(whip){
price += 0.1;
}
return price;
}
public void addMocha(){
this.mocha = true;
}
public void addWhip(){
this.whip = true;
}
}
</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 1812px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Decaf </span><span class="keyword">extends</span><span> Coffee{ </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class="alt"><span> <span class="keyword">double</span><span> price = </span><span class="keyword">super</span><span>.cost(); </span></span></li><li class=""><span> price += <span class="number">2.0</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> price; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Decaf extends Coffee{
public double cost(){
double price = super.cost();
price += 2.0;
return price;
}
}</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 2006px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Espresso </span><span class="keyword">extends</span><span> Coffee { </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class="alt"><span> <span class="keyword">double</span><span> price = </span><span class="keyword">super</span><span>.cost(); </span></span></li><li class=""><span> price += <span class="number">2.5</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> price; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Espresso extends Coffee {
public double cost(){
double price = super.cost();
price += 2.5;
return price;
}
}</pre>
<p><a href="http://lib.csdn.net/base/softwaretest" class="replace_word" title="软件测试知识库" target="_blank" style="color:#df3434; font-weight:bold;">测试</a>一下:</p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 2244px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Test { </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) { </span></span></li><li class="alt"><span> Coffee coffee = <span class="keyword">new</span><span> Decaf(); </span></span></li><li class=""><span> coffee.addMocha(); </span></li><li class="alt"><span> coffee.addWhip(); </span></li><li class=""><span> <span class="comment">//2.6</span><span> </span></span></li><li class="alt"><span> System.out.println(coffee.cost()); </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Test {
public static void main(String[] args) {
Coffee coffee = new Decaf();
coffee.addMocha();
coffee.addWhip();
//2.6
System.out.println(coffee.cost());
}
}</pre>
<p>考虑到下面几个问题,设计二有明显的不足:</p>
<p>1,如果调味品的种类较多,Coffee类将会变得相当庞大,难以维护</p>
<p>2,无法处理顾客希望添加双倍的Mocha的场景</p>
<p>3,添加一种新的咖啡IceCoffee,从逻辑上来说IceCoffee是不能加Mocha的,但是由于IceCoffee类继承自Coffee类,IceCoffee类依然从父类继承了addMocha()方法,这就需要在IceCoffee类中重写一个空的addMocha()方法,并且当使用IceCoffee类时,不能够面向Coffee类编程,以避免错误的调用父类方法</p>
<p><strong>设计三--装饰器模式:</strong></p>
<img src="http://img.blog.csdn.net/20150724163818712?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
<p>装饰模式分为3个部分:</p>
<p>1,抽象组件 -- 对应Coffee类</p>
<p>2,具体组件 -- 对应具体的咖啡,如:Decaf,Espresso</p>
<p>3,装饰者 -- 对应调味品,如:Mocha,Whip</p>
<p>装饰模式有3个特点:</p>
<p>1,具体组件和装饰者都继承自抽象组件(Decaf、Espresson、Mocha和Whip都继承自Coffee),并且装饰者持有抽象组件的引用</p>
<p>2,可以使用装饰者组合具体组件创造出新的类(Mocha组合Decaf创造出MochaDecaf)</p>
<p>3,过程2可以重复,直到创造出需要的类</p>
<p>使用装饰模式,想要获得一个WhipDoubleMochaEspresso是很容易的:</p>
<img src="http://img.blog.csdn.net/20150724174118284?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 3666px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> Coffee { </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(); </span></span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public interface Coffee {
public double cost();
}</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 3788px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_6" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_6" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=6&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Espresso </span><span class="keyword">implements</span><span> Coffee { </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="number">2.5</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Espresso implements Coffee {
public double cost(){
return 2.5;
}
}</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 3946px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_7" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_7" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=7&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Dressing </span><span class="keyword">implements</span><span> Coffee { </span></span></li><li class=""><span> <span class="keyword">private</span><span> Coffee coffee; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> Dressing(Coffee coffee){ </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.coffee = coffee; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> coffee.cost(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Dressing implements Coffee {
private Coffee coffee;
public Dressing(Coffee coffee){
this.coffee = coffee;
}
public double cost(){
return coffee.cost();
}
}</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 4212px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_8" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_8" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=8&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Whip </span><span class="keyword">extends</span><span> Dressing { </span></span></li><li class=""><span> <span class="keyword">public</span><span> Whip(Coffee coffee){ </span></span></li><li class="alt"><span> <span class="keyword">super</span><span>(coffee); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">super</span><span>.cost() + </span><span class="number">0.1</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Whip extends Dressing {
public Whip(Coffee coffee){
super(coffee);
}
public double cost(){
return super.cost() + 0.1;
}
}</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 4442px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_9" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_9" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=9&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Mocha </span><span class="keyword">extends</span><span> Dressing { </span></span></li><li class=""><span> <span class="keyword">public</span><span> Mocha(Coffee coffee){ </span></span></li><li class="alt"><span> <span class="keyword">super</span><span>(coffee); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> cost(){ </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">super</span><span>.cost() + </span><span class="number">0.5</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Mocha extends Dressing {
public Mocha(Coffee coffee){
super(coffee);
}
public double cost(){
return super.cost() + 0.5;
}
}</pre>
<p>测试一下:</p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 839px; top: 4716px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_10" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_10" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=10&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Test { </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) { </span></span></li><li class="alt"><span> Coffee coffee = <span class="keyword">new</span><span> Espresso(); </span></span></li><li class=""><span> coffee = <span class="keyword">new</span><span> Mocha(coffee); </span></span></li><li class="alt"><span> coffee = <span class="keyword">new</span><span> Mocha(coffee); </span></span></li><li class=""><span> coffee = <span class="keyword">new</span><span> Whip(coffee); </span></span></li><li class="alt"><span> <span class="comment">//3.6(2.5 + 0.5 + 0.5 + 0.1)</span><span> </span></span></li><li class=""><span> System.out.println(coffee.cost()); </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre name="code" class="java" style="display: none;">public class Test {
public static void main(String[] args) {
Coffee coffee = new Espresso();
coffee = new Mocha(coffee);
coffee = new Mocha(coffee);
coffee = new Whip(coffee);
//3.6(2.5 + 0.5 + 0.5 + 0.1)
System.out.println(coffee.cost());
}
}</pre>
<p>当然Decorator类中可以重写父类的方法,也可以扩展自己需要的方法</p>
<p> </p>
<p><span style="color:#FF0000">装饰模式的缺点:</span></p>
<p>1,装饰模式虽然扩展性较高,但是没有设计二简洁,类的数量略多(但肯定比设计一少很多),如何取舍可扩展性和简洁性是个问题,有所选择就要有所牺牲</p>
<p>2,很难搞清楚一个类究竟被装饰了多少层,可能是1层,也可能是100层</p>
</div>
<!-- Baidu Button BEGIN -->
<div class="bdsharebuttonbox tracking-ad bdshare-button-style0-16" style="float: right;" data-mod="popu_172" data-bd-bind="1500946351034">
<a href="#" class="bds_more" data-cmd="more" style="background-position:0 0 !important; background-image: url(http://bdimg.share.baidu.com/static/api/img/share/icons_0_16.png?v=d754dcc0.png) !important" target="_blank"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间" style="background-position:0 -52px !important" target="_blank"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博" style="background-position:0 -104px !important" target="_blank"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博" style="background-position:0 -260px !important" target="_blank"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网" style="background-position:0 -208px !important" target="_blank"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信" style="background-position:0 -1612px !important" target="_blank"></a>
</div>
<script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script>
<!-- Baidu Button END -->
<!--172.16.140.14-->
<!-- Baidu Button BEGIN -->
<script type="text/javascript" id="bdshare_js" data="type=tools&uid=1536434" src="http://bdimg.share.baidu.com/static/js/bds_s_v2.js?cdnversion=416930"></script>
<script type="text/javascript">
document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
</script>
<!-- Baidu Button END -->
<div id="digg" articleid="8980503">
<dl id="btnDigg" class="digg digg_disable" onclick="btndigga();">
<dt>顶</dt>
<dd>5</dd>
</dl>
<dl id="btnBury" class="digg digg_disable" onclick="btnburya();">
<dt>踩</dt>
<dd>2</dd>
</dl>
</div>
<div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank"> </a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank"> </a></div>
<script type="text/javascript">
function btndigga() {
$(".tracking-ad[data-mod='popu_222'] a").click();
}
function btnburya() {
$(".tracking-ad[data-mod='popu_223'] a").click();
}
</script>
<ul class="article_next_prev">
<li class="prev_article"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian']);location.href='http://blog.csdn.net/a19881029/article/details/8975962';">上一篇</span><a href="http://blog.csdn.net/a19881029/article/details/8975962" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian'])">JDK自带的观察者模式</a></li>
<li class="next_article"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian']);location.href='http://blog.csdn.net/a19881029/article/details/8990655';">下一篇</span><a href="http://blog.csdn.net/a19881029/article/details/8990655" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian'])">JDK中的装饰模式:Java I/O</a></li>
</ul>
<div style="clear:both; height:10px;"></div>
<div class="similar_article">
<h4></h4>
<div class="similar_c" style="margin:20px 0px 0px 0px">
<div class="similar_c_t">
相关文章推荐
</div>
<div class="similar_wrap tracking-ad" data-mod="popu_36">
<ul class="similar_list fl">
<li>
<em>•</em>
<a href="http://blog.csdn.net/a19881029/article/details/8975962" title="JDK自带的观察者模式" strategy="BlogCommendFromBaidu" target="_blank">JDK自带的观察者模式</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/xyjwsj/article/details/55211802" title="Java设计模式(观察者模式JDK自带)" strategy="BlogCommendFromBaidu" target="_blank">Java设计模式(观察者模式JDK自带)</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/coding_man_xie/article/details/49622423" title="java设计模式--装饰者模式(Decorater Pattern)" strategy="BlogCommendFromBaidu" target="_blank">java设计模式--装饰者模式(Decorater Pattern)</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/jason0539/article/details/22713711" title="JAVA设计模式初探之装饰者模式" strategy="BlogCommendFromBaidu" target="_blank">JAVA设计模式初探之装饰者模式</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/lenotang/article/details/2587265" title="装饰模式" strategy="BlogCommendFromBaidu" target="_blank">装饰模式</a>
</li>
</ul>
<ul class="similar_list fr">
<li>
<em>•</em>
<a href="http://blog.csdn.net/lansuiyun/article/details/11714957" title="装饰者模式" strategy="BlogCommendFromBaidu" target="_blank">装饰者模式</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/u012909091/article/details/38665187" title="设计模式——装饰模式(Decorator)" strategy="BlogCommendFromBaidu" target="_blank">设计模式——装饰模式(Decorator)</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/gdutxiaoxu/article/details/51885105" title="装饰者模式及其应用" strategy="BlogCommendFromBaidu" target="_blank">装饰者模式及其应用</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/zhanghongjie0302/article/details/17251413" title="设计模式之装饰者模式" strategy="BlogCommendFromBaidu" target="_blank">设计模式之装饰者模式</a>
</li>
<li>
<em>•</em>
<a href="http://blog.csdn.net/xdd19910505/article/details/22880469" title="装饰模式 VS. 外观模式" strategy="BlogCommendFromBaidu" target="_blank">装饰模式 VS. 外观模式</a>
</li>
</ul>
</div>
</div>
</div>
</div>
阅读全文
0 0
- 开发者模式------装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- 装饰模式
- C# 定时器理解
- Help is needed for Dexter UVA
- 本萌新的教学楼
- Python3基础-字典
- 谈一谈array_pop和end有什么差别?
- 开发者模式------装饰模式
- Linux安装JDK步骤
- 看桔子水晶吴海小感
- java中queue的使用
- 《剑指offer》按之字行顺序打印二叉树
- codeforces 621A Wet Shark and Odd and Even
- 项目开发记录——全民矿工20170725
- Ubuntu14.04 ROS Indigo安装,卸载方法 ,以及roscore运行错误解决
- 实习点滴(5)--Tensorflow文档学习