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>
动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
开放关闭原则:
类应该对扩展开放,对修改关闭。
- /*
- * Beverage is a abstract class.
- * 相当一个组件(component),每个组件可以单独使用,也可以被其他装饰者包起来使用。
- */
- public abstract class Beverage {
- String description="Unknow Beverage";
- public String getDestription(){ //this method() has implememt here,but it's subclass must implement.
- return description;
- }
- public abstract double cost();
- }
- /**
- * @author zhq426
- *装饰者,每一个装饰者都有”一个“(包装)组件,也就是说,装饰者有一个
- *实例变量以保存某个componet的引用。
- *这是装饰者共同实现的接口,也是抽象类。
- */
- public abstract class CondimentDecorator extends Beverage {
- /* (non-Javadoc)
- * @see org.zhq.Beverage#getDestription()
- */
- @Override
- public abstract String getDestription() ;
- }
- /**
- * @author zhq426
- *
- */
- public class Espresso extends Beverage {
- /* (non-Javadoc)
- * @see org.zhq.Beverage#cost()
- */
- @Override
- public double cost() {
- // TODO Auto-generated method stub
- return 1.99;
- }
- /**
- *
- */
- public Espresso() {
- // TODO Auto-generated constructor stub
- description="Espresso";
- }
- }
- /**
- * @author zhq426
- *具体组件。
- */
- public class HouseBlend extends Beverage {
- /**
- *
- */
- public HouseBlend() {
- // TODO Auto-generated constructor stub
- description="House Blend Coffee";
- }
- /* (non-Javadoc)
- * @see org.zhq.Beverage#cost()
- */
- @Override
- public double cost() {
- // TODO Auto-generated method stub
- return 0.89;
- }
- }
- /**
- * @author zhq426
- *
- */
- public class DarkRoast extends Beverage {
- /**
- *
- */
- public DarkRoast() {
- // TODO Auto-generated constructor stub
- description="DarkRoast Coffee";
- }
- /* (non-Javadoc)
- * @see org.zhq.Beverage#cost()
- */
- @Override
- public double cost() {
- // TODO Auto-generated method stub
- return 3.2;
- }
- }
- /**
- * @author zhq426
- *
- */
- public class Decat extends Beverage {
- /**
- *
- */
- public Decat() {
- // TODO Auto-generated constructor stub
- description="Decat Coffee";
- }
- /* (non-Javadoc)
- * @see org.zhq.Beverage#cost()
- */
- @Override
- public double cost() {
- // TODO Auto-generated method stub
- return 0.25;
- }
- }
- /**
- * @author zhq426
- *
- */
- public class Mocha extends CondimentDecorator {
- Beverage beverage;
- /**
- *
- */
- public Mocha(Beverage beverage) {
- // TODO Auto-generated constructor stub
- this.beverage=beverage;
- }
- /* (non-Javadoc)
- * @see org.zhq.CondimentDecorator#getDestription()
- */
- @Override
- public String getDestription() {
- // TODO Auto-generated method stub
- return beverage.getDestription()+",Mocha";
- }
- /* (non-Javadoc)
- * @see org.zhq.Beverage#cost()
- */
- @Override
- public double cost() {
- // TODO Auto-generated method stub
- return 0.20+beverage.cost();
- }
- }
- /**
- * @author zhq426
- *
- */
- public class Soy extends CondimentDecorator {
- Beverage beverage;
- public Soy(Beverage beverage){
- this.beverage=beverage;
- }
- /* (non-Javadoc)
- * @see org.zhq.CondimentDecorator#getDestription()
- */
- @Override
- public String getDestription() {
- // TODO Auto-generated method stub
- return beverage.getDestription()+",Soy";
- }
- /* (non-Javadoc)
- * @see org.zhq.Beverage#cost()
- */
- @Override
- public double cost() {
- // TODO Auto-generated method stub
- return 0.3+beverage.cost();
- }
- }
- /**
- * @author zhq426
- *
- */
- public class Whip extends CondimentDecorator {
- Beverage beverage;
- public Whip(Beverage beverage){
- this.beverage=beverage;
- }
- /* (non-Javadoc)
- * @see org.zhq.CondimentDecorator#getDestription()
- */
- @Override
- public String getDestription() {
- // TODO Auto-generated method stub
- return beverage.getDestription()+",Whip";
- }
- /* (non-Javadoc)
- * @see org.zhq.Beverage#cost()
- */
- @Override
- public double cost() {
- // TODO Auto-generated method stub
- return 0.5+beverage.cost();
- }
- }
- /**
- * @author zhq426
- *
- */
- public class StarbuzzCoffee {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Beverage beverage=new Espresso();
- System.out.println(beverage.getDestription()
- +"$"+beverage.cost());
- Beverage beverage2=new DarkRoast();
- beverage2=new Mocha(beverage2);
- beverage2=new Mocha(beverage2);
- beverage2=new Whip(beverage2);
- System.out.println(beverage2.getDestription()
- +"$"+beverage2.cost());
- Beverage beverage3=new HouseBlend();
- beverage3=new Soy(beverage3);
- beverage3 =new Mocha(beverage3);
- beverage3= new Whip(beverage3);
- System.out.println(beverage3.getDestription()
- +"$"+beverage3.cost());
- }
- }