Laughing

 

装饰者模式

 本质:

    动态的将责任附加到对象上。

    若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

    java.io 里面用到了装饰器模式

UML图:

下面我将给出实现。大致思想:(没有装饰基类)

Basket接口类:

 

public interface Basket

{

    void show();

}

一个Basket的具体类:

 

public class myBasket implements Basket

{

   public void show()

{

System.out.println("This is my Basket,it contains:");

}

}

下面是两个装饰者类:

1:向篮子中加入一个苹果:

public class appleDecorator implements Basket

{

   private Basket b;  //往哪个篮子里面加

   appleDecorator(Basket b){this.b=b;}

   public void show()

   {

       b.show();

       System.out.println("apple");

   }

}

2:加入香蕉:

public class bananaDecorator implements Basket

{

   private Basket b;

   bananaDecorator(Basket b){this.b=b;}

   public void show()

   {

       b.show();

       System.out.println("banana");

   }

}

测试函数:

 

public class test

{

    public static void main(String[] args)

    {       

         Basket b=new myBasket();    //创建一个篮子
         b=new bananaDecorator(b);  //往篮子里加一个香蕉
         b=new bananaDecorator(b);  //往篮子里加一个香蕉
         b=new appleDecorator(b);    //往篮子里加一个苹果
        //b=new appleDecorator(new bananaDecorator(new bananaDecorator(b)));

        //上面实现的是一步一步的加,这里是一次加满,效果一样
        b.show();

    }

}

输出:

This is my Basket,it contains:

apple

banana

这说明先Apple装饰者先被创建。

适用性

  1.需要扩展一个类的功能,或给一个类增加附加责任。

  2.需要动态地给一个对象增加功能,这些功能可以再动态地撤销。

  3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。

总结

      Decorator模式采用对象组合而非继承的手法,实现了在运行时动态的扩展对象功能的能力,而且可以根据需要扩展多个功能,避免了单独使用继承带来的“灵活性差”和“多子类衍生问题”。同时它很好地符合面向对象设计原则中“优先使用对象组合而非继承”和“开放-封闭”原则。



posted on 2011-12-30 09:56  巨富一生  阅读(167)  评论(0编辑  收藏  举报

导航