`

Head First装饰者模式

阅读更多
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 11"><meta name="Originator" content="Microsoft Word 11"><link href="file:///C:%5CDOCUME%7E1%5Czhq426%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" rel="File-List"><style> </style>

装饰者模式:<o:p></o:p>

       动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

开放关闭原则:

       类应该对扩展开放,对修改关闭。


  1. /*
  2.  * Beverage is a abstract class.
  3.  * 相当一个组件(component),每个组件可以单独使用,也可以被其他装饰者包起来使用。
  4.  */
  5. public abstract class Beverage {
  6.     String description="Unknow Beverage";
  7.     
  8.     public String getDestription(){ //this method() has implememt here,but it's subclass must implement.
  9.         return description;
  10.     }
  11.     public abstract double cost();
  12.     
  13. }
  14. /**
  15.  * @author zhq426
  16.  *装饰者,每一个装饰者都有”一个“(包装)组件,也就是说,装饰者有一个
  17.  *实例变量以保存某个componet的引用。
  18.  *这是装饰者共同实现的接口,也是抽象类。
  19.  */
  20. public abstract class CondimentDecorator extends Beverage {
  21.     /* (non-Javadoc)
  22.      * @see org.zhq.Beverage#getDestription()
  23.      */
  24.     @Override
  25.     public abstract String getDestription() ;
  26.     
  27. }
  28. /**
  29.  * @author zhq426
  30.  *
  31.  */
  32. public class Espresso extends Beverage {
  33.     /* (non-Javadoc)
  34.      * @see org.zhq.Beverage#cost()
  35.      */
  36.     @Override
  37.     public double cost() {
  38.         // TODO Auto-generated method stub
  39.         return 1.99;
  40.     }
  41.     /**
  42.      * 
  43.      */
  44.     public Espresso() {
  45.         // TODO Auto-generated constructor stub
  46.         description="Espresso";
  47.     }
  48. }
  49. /**
  50.  * @author zhq426
  51.  *具体组件。
  52.  */
  53. public class HouseBlend extends Beverage {
  54.     /**
  55.      * 
  56.      */
  57.     public HouseBlend() {
  58.         // TODO Auto-generated constructor stub
  59.         description="House Blend Coffee";
  60.     }
  61.     /* (non-Javadoc)
  62.      * @see org.zhq.Beverage#cost()
  63.      */
  64.     @Override
  65.     
  66.     public double cost() {
  67.         // TODO Auto-generated method stub
  68.         return 0.89;
  69.     }
  70. }
  71. /**
  72.  * @author zhq426
  73.  *
  74.  */
  75. public class DarkRoast extends Beverage {
  76.     /**
  77.      * 
  78.      */
  79.     public DarkRoast() {
  80.         // TODO Auto-generated constructor stub
  81.         description="DarkRoast Coffee";
  82.     }
  83.     /* (non-Javadoc)
  84.      * @see org.zhq.Beverage#cost()
  85.      */
  86.     @Override
  87.     public double cost() {
  88.         // TODO Auto-generated method stub
  89.         return 3.2;
  90.     }
  91. }
  92. /**
  93.  * @author zhq426
  94.  *
  95.  */
  96. public class Decat extends Beverage {
  97.     /**
  98.      * 
  99.      */
  100.     public Decat() {
  101.         // TODO Auto-generated constructor stub
  102.         description="Decat Coffee";
  103.         
  104.     }
  105.     /* (non-Javadoc)
  106.      * @see org.zhq.Beverage#cost()
  107.      */
  108.     @Override
  109.     public double cost() {
  110.         // TODO Auto-generated method stub
  111.         return 0.25;
  112.     }
  113. }
  114. /**
  115.  * @author zhq426
  116.  *
  117.  */
  118. public class Mocha extends CondimentDecorator {
  119.     Beverage beverage;
  120.     /**
  121.      * 
  122.      */
  123.     public Mocha(Beverage beverage) {
  124.         // TODO Auto-generated constructor stub
  125.         this.beverage=beverage;
  126.     }
  127.     /* (non-Javadoc)
  128.      * @see org.zhq.CondimentDecorator#getDestription()
  129.      */
  130.     @Override
  131.     public String getDestription() {
  132.         // TODO Auto-generated method stub
  133.         return beverage.getDestription()+",Mocha";
  134.     }
  135.     /* (non-Javadoc)
  136.      * @see org.zhq.Beverage#cost()
  137.      */
  138.     @Override
  139.     public double cost() {
  140.         // TODO Auto-generated method stub
  141.         return 0.20+beverage.cost();
  142.     }
  143. }
  144. /**
  145.  * @author zhq426
  146.  *
  147.  */
  148. public class Soy extends CondimentDecorator {
  149.     Beverage beverage;
  150.     
  151.     public Soy(Beverage beverage){
  152.         this.beverage=beverage;
  153.     }
  154.     /* (non-Javadoc)
  155.      * @see org.zhq.CondimentDecorator#getDestription()
  156.      */
  157.     @Override
  158.     public String getDestription() {
  159.         // TODO Auto-generated method stub
  160.         return beverage.getDestription()+",Soy";
  161.     }
  162.     /* (non-Javadoc)
  163.      * @see org.zhq.Beverage#cost()
  164.      */
  165.     @Override
  166.     public double cost() {
  167.         // TODO Auto-generated method stub
  168.         return 0.3+beverage.cost();
  169.     }
  170. }
  171. /**
  172.  * @author zhq426
  173.  *
  174.  */
  175. public class Whip extends CondimentDecorator {
  176.     Beverage beverage;
  177.     public Whip(Beverage beverage){
  178.         this.beverage=beverage;
  179.     }
  180.     /* (non-Javadoc)
  181.      * @see org.zhq.CondimentDecorator#getDestription()
  182.      */
  183.     @Override
  184.     public String getDestription() {
  185.         // TODO Auto-generated method stub
  186.         return beverage.getDestription()+",Whip";
  187.     }
  188.     /* (non-Javadoc)
  189.      * @see org.zhq.Beverage#cost()
  190.      */
  191.     @Override
  192.     public double cost() {
  193.         // TODO Auto-generated method stub
  194.         return 0.5+beverage.cost();
  195.     }
  196. }
  197. /**
  198.  * @author zhq426
  199.  *
  200.  */
  201. public class StarbuzzCoffee {
  202.     /**
  203.      * @param args
  204.      */
  205.     public static void main(String[] args) {
  206.         // TODO Auto-generated method stub
  207.         Beverage beverage=new Espresso();
  208.         System.out.println(beverage.getDestription()
  209.                 +"$"+beverage.cost());
  210.         Beverage beverage2=new DarkRoast();
  211.         beverage2=new Mocha(beverage2);
  212.         beverage2=new Mocha(beverage2);
  213.         beverage2=new Whip(beverage2);
  214.         System.out.println(beverage2.getDestription()
  215.                 +"$"+beverage2.cost());
  216.         Beverage beverage3=new HouseBlend();
  217.         beverage3=new Soy(beverage3);
  218.         beverage3 =new Mocha(beverage3);
  219.         beverage3= new Whip(beverage3);
  220.         System.out.println(beverage3.getDestription()
  221.                 +"$"+beverage3.cost());
  222.         
  223.     }
  224. }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics