注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 Exchange服务器系列课程之..
 帮助

装饰者模式


2008-03-17 22:51:15
 标签:装饰者 开发 模式    [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://sophi.blog.51cto.com/340461/66332
/*
* 装饰者模式
* 动态地将责任附加到对象上。
* 想要扩展功能,装饰者提供有别于继承的另一种选择
*/

public class Decorator {

    public static void main(String[] args) {
  Beverage beverage = new Espresso();
  System.out.println(beverage.getDescription() + " $" + beverage.cost());
  
  Beverage beverage2 = new HouseBlend();
  beverage2 = new Mocha(beverage2);
  beverage2 = new Mocha(beverage2);
  beverage2 = new Milk(beverage2);
  System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
  }
}

//元件的抽象类
abstract class Beverage{
    String description = "";
  
    public String getDescription(){
  return description;
    }
  
    abstract public void print();
  
    public abstract double cost();
}

//装饰类的抽象类,作用是统一装饰类的接口,方便代码的重用
abstract class CondimentDecorator extends Beverage{
    public abstract String getDescription();
}

//具体的元件类
class Espresso extends Beverage{
    public Espresso(){
  description = "Espresso";
    }
  
    public void print(){
  System.out.println("Espresso");
    }
  
    public double cost(){
  return 1.99;
    }
}

class HouseBlend extends Beverage{
    public HouseBlend() {
  description = "HouseBlend";
    }
  
    public void print(){
  System.out.println("HouseBlend");
    }
  
    public double cost(){
  return 0.89;
    }
}

//具体的装饰者类,注意要持有一个元件类
class Mocha extends Beverage{
    Beverage beverage;
  
    public Mocha (Beverage beverage) {
  this.beverage = beverage;
    }
  
    public String getDescription() {
  return beverage.getDescription() + ",Mocha";
    }
  
    public double cost() {
  return 0.20 + beverage.cost();  
    }
  
    public void print(){
  beverage.print();
  System.out.println("Mocha");
    }
}

class Milk extends Beverage{
    Beverage beverage;
  
    public Milk (Beverage beverage) {
  this.beverage = beverage;
    }
  
    public String getDescription() {
  return beverage.getDescription() + ",Milk";
    }
  
    public double cost() {
  return 0.40 + beverage.cost();  
    }
  
    public void print(){
  System.out.println("Milk");
  beverage.print();
    }
}

本文出自 ““技”忆” 博客,请务必保留此出处http://sophi.blog.51cto.com/340461/66332



上一篇 JDBC事务的操作  下一篇 工厂方法模式



    文章评论
 
2008-03-18 10:17:08
来看看。。

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: