`
wangchao_17915566
  • 浏览: 169915 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

了解装饰模式

 
阅读更多

装饰模式:动态给一个对象添加一些额外的职责,使用Decorator模式比用生成子类方法达到功能的扩充更为灵活

为什么使用:通常使用继承来实现功能扩展,如果扩展的功能种类繁多,会生成很多子类,增加系统的复杂性。使用继承实现扩展必须预见性,在编译前已确定,是静态的。

例如要去商店买肉,首先定义买的接口

public interface Shop {
   public void buy();
}

 

下面我要买肉,继而实现此接口

public class BuyMeat implements Shop{

	public void buy() {
		System.out.println("买肉");
	}

}

 一般客户要买什么,就实例这个实现类,就ok了。如果我买肉之前或之后想买点蔬菜或者点心等等,但是从上面可以看出,没有实现买蔬菜及点心的接口,怎么办?这就是上面所说的预见性。

这样我们就可以通过装饰模式来实现。

public class Decorator implements Shop{

	private Shop shop;
	
//	额外干的任务
	private ArrayList others = new ArrayList(); 
	
	public Decorator(Shop shop){
		this.shop = shop;
		others.add("买蔬菜");
		others.add("买点心");
	}
	public void buy() {
		newMethod();
	}
	
	public void newMethod(){
		otherMethod();
		shop.buy();
	}


	public void otherMethod(){
		ListIterator listIterator = others.listIterator();
		while(listIterator.hasNext()){
			System.out.println("+++++++++"+listIterator.next().toString());
		}
	}

}

 

我可以将我要干的事情统一起来,最后一起进行,这样就可以实现上述需求。

 

我们通过测试看下

public class Client {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
	      Shop	buyMeat = new BuyMeat();
	      Shop decorator = new Decorator(buyMeat);
	      decorator.buy();
	}
}

 

这个测试,可以看出应该将一些列的对象都转换为接口对象。这也正是一步步的装饰,事实它们的根源也都是接口对象。

测试结果

+++++++++买蔬菜
+++++++++买点心
买肉

在买肉之前买了蔬菜,和点心。

此贴仅是个人初步学习理解,如果有错误或不对的地方请大家批评

分享到:
评论
9 楼 ycysth 2009-09-01  
这样貌似也不能算是动态的吧
8 楼 thevone 2009-07-24  
这是静态代理。。
7 楼 val831201 2009-02-25  
LZ的这个例子,估计不太典型,瞧不出模式的特点
6 楼 ysen 2009-02-18  
代理模式和装饰模式的区别主要体现在哪里?我觉得这更像是代理模式
5 楼 ysen 2009-02-18  
<div class="quote_title">wangchao_17915566 写道</div>
<div class="quote_div">
<p>装饰模式:动态给一个对象添加一些额外的职责,使用Decorator模式比用生成子类方法达到功能的扩充更为灵活</p>
<p>为什么使用:通常使用继承来实现功能扩展,如果扩展的功能种类繁多,会生成很多子类,增加系统的复杂性。使用继承实现扩展必须预见性,在编译前已确定,是静态的。</p>
<p>例如要去商店买肉,首先定义买的接口</p>
<pre name="code" class="java">public interface Shop {
   public void buy();
}</pre>
<p> </p>
<p>下面我要买肉,继而实现此接口</p>
<pre name="code" class="java">public class BuyMeat implements Shop{

public void buy() {
System.out.println("买肉");
}

}</pre>
<p> 一般客户要买什么,就实例这个实现类,就ok了。如果我买肉之前或之后想买点蔬菜或者点心等等,但是从上面可以看出,没有实现买蔬菜及点心的接口,怎么办?这就是上面所说的预见性。</p>
<p>这样我们就可以通过装饰模式来实现。</p>
<pre name="code" class="java">public class Decorator implements Shop{

private Shop shop;

// 额外干的任务
private ArrayList others = new ArrayList();

public Decorator(Shop shop){
this.shop = shop;
others.add("买蔬菜");
others.add("买点心");
}
public void buy() {
newMethod();
}

public void newMethod(){
otherMethod();
shop.buy();
}


public void otherMethod(){
ListIterator listIterator = others.listIterator();
while(listIterator.hasNext()){
System.out.println("+++++++++"+listIterator.next().toString());
}
}

}</pre>
<p> </p>
<p>我可以将我要干的事情统一起来,最后一起进行,这样就可以实现上述需求。</p>
<p> </p>
<p>我们通过测试看下</p>
<pre name="code" class="java">public class Client {
/**
* @param args
*/
public static void main(String[] args) {
      Shop buyMeat = new BuyMeat();
      Shop decorator = new Decorator(buyMeat);
      decorator.buy();
}
}</pre>
<p> </p>
<p>这个测试,可以看出应该将一些列的对象都转换为接口对象。这也正是一步步的装饰,事实它们的根源也都是接口对象。</p>
<p>测试结果</p>
<p>+++++++++买蔬菜<br />+++++++++买点心<br />买肉</p>
<p>在买肉之前买了蔬菜,和点心。</p>
<p>此贴仅是个人初步学习理解,如果有错误或不对的地方请大家批评</p>
</div>
<p> </p>
4 楼 xuyao 2008-12-03  
Decorator模式在原来很常用,经常用到连接池等,后来被1.4之后的动态代理替换了。
3 楼 wangchao_17915566 2008-12-03  
hanjs 写道

lz可以看看这个文章 http://www.iteye.com/topic/220230 很不错。这个才是装饰模式(一层一层进行包装)

谢谢,你发的这个帖子的确很透彻,我会继续学习
2 楼 hanjs 2008-12-03  
lz可以看看这个文章

http://www.iteye.com/topic/220230

很不错。这个才是装饰模式(一层一层进行包装)
1 楼 hanjs 2008-12-03  
如果我买肉之前或之后想买点蔬菜或者点心等等,但是从上面可以看出,没有实现买蔬菜及点心的接口,怎么办?这就是上面所说的预见性。

感觉不对吧。难道你这样处理买菜和点心就不是预见性么?

装饰是对子类的扩张,在继承或重载父类的方法时增加额外的处理吧。

相关推荐

    Decorator 装饰模式

    了解装饰模式并熟练运用,对于提升软件设计的灵活性和可维护性至关重要。通过阅读相关源码,我们可以更好地理解装饰模式的实现细节,以及如何在实际项目中应用这一模式。此外,工具的使用也是学习过程中不可或缺的一...

    装饰模式-基本代码.rar_C#

    首先,让我们了解装饰模式的基本结构。它通常包含以下几个部分: 1. **组件接口(Component)**:定义了对象的基本接口,所有被装饰的对象以及装饰对象都必须实现这个接口。 2. **原始组件(Concrete Component)**...

    C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) (Level 300)

    首先,让我们了解装饰模式的基本组件: 1. **Component(组件)**:这是被装饰的对象的接口。它可以是抽象类或接口,定义了装饰者和组件对象共享的基本行为。 2. **ConcreteComponent(具体组件)**:实现了...

    装饰模式代码示例

    7. **学习路径**:理解装饰模式的基本概念后,可以通过阅读代码示例来了解如何创建装饰类和如何使用它们。然后,可以尝试自己设计一个装饰模式的实例,加深理解和应用。 8. **文档**:压缩包中的文档可能会详细解释...

    C#设计模式之Decorator 装饰模式

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...

    HeadFirst 设计模式学习笔记3--装饰模式 Demo

    装饰模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。...通过HeadFirst的学习笔记,读者可以更直观地了解如何在实际项目中应用装饰模式,提高代码的可维护性和可扩展性。

    装饰模式实现AOP

    通过分析和理解这些代码,你可以更深入地了解如何使用装饰模式来实现AOP,以及如何在不修改原有业务代码的情况下,优雅地添加横切关注点。这种设计模式提供了很大的灵活性,使得系统能够根据需求动态调整,同时保持...

    JAVA设计模式学习12——装饰器模式

    2. **动态性**:装饰模式允许我们在运行时动态地为对象添加新功能,而无需修改代码。 3. **组合性**:通过多个装饰者的叠加,可以实现更复杂的功能,这比使用继承来扩展功能更加灵活。 4. **职责分离**:装饰者模式...

    java设计模式之装饰者模式代码

    让我们深入了解一下装饰者模式的结构和工作原理: 1. **Component(组件)**:这是所有具体组件和装饰者的公共接口,定义了它们共同的行为。在Java中,这可能是一个抽象类或接口。 2. **ConcreteComponent(具体...

    java 装饰模式 设计模式

    通过运行`Test.java`,我们可以看到装饰模式在实际场景中的应用,了解如何通过组合而非继承来扩展对象的功能。这种模式的优势在于,它可以独立于对象的其他部分进行扩展,使得代码更易于维护和扩展,同时也遵循了...

    装饰器模式的简单demo

    装饰器模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改原有类的代码。这种模式通过创建包装对象(即装饰器)来包裹原对象,装饰器对象拥有与原对象相同的接口,因此可以在不改变...

    Ruby使用设计模式中的代理模式与装饰模式的代码实例共3页

    本资料主要探讨的是代理模式(Proxy Pattern)和装饰模式(Decorator Pattern)在Ruby中的实现,通过具体的代码实例,帮助开发者理解和运用这两种模式。 **代理模式**是一种结构型设计模式,它创建了一个拥有与目标...

    JAVA设计模式例程-装饰模式

    JAVA设计模式例程-装饰模式-的例程,看完以后基本上能对JAVA上实现装饰模式能有所了解,个人认为常各种模式并不是为了死套各种模式,而应该是灵活的在项目中结合实际情况而用各种模式的组合应用,呵呵!但前提是得对...

    设计模式---装饰者模式

    装饰者模式是一种结构型设计模式,...了解并熟练掌握装饰者模式,是提升软件设计能力的重要一步。通过阅读和实践 DecoratorPattern 文件中的示例代码,你可以更深入地理解装饰者模式的工作原理及其在实际项目中的应用。

    java学习内容[文].pdf

    4. I/O编程:了解装饰模式,掌握Java的输入输出流系统,如FileInputStream、FileOutputStream、BufferedReader和BufferedWriter等。 5. 网络编程:理解Socket编程,URL、URLConnection和ServerSocket的使用,TCP和...

    装饰者模式

    首先,我们要了解装饰者模式的四个主要角色: 1. 抽象构件(Component)角色:这是装饰者模式的基础,它定义了对象的基本行为和接口。抽象构件角色通常是被装饰的对象,可以是接口或者抽象类,提供了一组方法,这些...

    C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式)

    ### C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) ...通过本文的学习,我们不仅可以了解到装饰模式的基本概念及其在实际项目中的应用,还能更好地理解面向对象设计的核心思想。

    快速了解JAVA设计模式

    - **装饰器模式**:动态地给一个对象添加一些额外的职责,可以用来扩展功能而不影响原有类。 - **代理模式**:为其他对象提供一种代理以控制对这个对象的访问。 - **桥接模式**:将抽象部分与它的实现部分分离,...

    简单了解设计模式中的装饰者模式及C++版代码实现

    由遇到的问题引出的装饰模式 在 OO 设计和开发过程,可能会经常遇到以下的情况:我们需要为一个已经定义好的类添加新的职责(操作),通常的情况我们会给定义一个新类继承自定义好的类,这样会带来一个问题(将在本...

    Java装饰器设计模式_动力节点Java学院整理

    首先,让我们了解一下装饰器设计模式的定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆。这种模式可以使得对象在不改变其结构的情况下,增加新的行为。 在 Java 中,装饰器设计模式的实现通过继承和组合...

Global site tag (gtag.js) - Google Analytics