zoukankan      html  css  js  c++  java
  • 设计模式之装饰者模式

    装饰者模式
    1.装饰者模式就像打包一个快递
    (1)主体:陶瓷,衣服。
    (2)报纸填充,塑料泡沫,纸板,木板
    2.Component
    3.ConcreteComponent和Decorator
    4.装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性。

    5.有些递归的意思

    类结构图

    示例代码

    package com.coffeebar.main;
    
    public abstract class Drink {
    	public String description = "";
    	private float price = 0f;
    	public String getDescription() {
    		return description;
    	}
    	public void setDescription(String description) {
    		this.description = description;
    	}
    	public float getPrice() {
    		return price;
    	}
    	public void setPrice(float price) {
    		this.price = price;
    	}
    	
    	public abstract float cost();
    	
    }
    
    package com.coffeebar.coffee;
    
    import com.coffeebar.main.Drink;
    
    public class Coffee extends Drink {
    
    	@Override
    	public float cost() {
    		// TODO Auto-generated method stub
    		return super.getPrice();
    	}
    
    }
    
    package com.coffeebar.coffee;
    
    import com.coffeebar.main.Drink;
    
    public class Decaf extends Coffee {
    
    	public Decaf() {
    		super.setDescription("Decaf");
    		super.setPrice(3.0f);
    	}
    
    }
    
    package com.coffeebar.coffee;
    
    public class Espresso extends Coffee {
    	public Espresso() {
    		super.setDescription("Espresso");
    		super.setPrice(4.0f);
    	}
    }
    
    package com.coffeebar.coffee;
    
    public class LongBlack extends Coffee {
    	public LongBlack() {
    		super.setDescription("LongBlack");
    		super.setPrice(5.5f);
    	}
    }
    
    package com.coffeebar.coffee;
    
    public class ShortBlack extends Coffee {
    	public ShortBlack() {
    		super.setDescription("ShortBlack");
    		super.setPrice(6.0f);
    	}
    }
    
    package com.coffeebar.decorator;
    
    import com.coffeebar.main.Drink;
    
    public class Decorator extends Drink {
    	private Drink Obj;
    	
    	public Decorator(Drink Obj) {
    		this.Obj = Obj;
    	}
    
    	@Override
    	public float cost() {
    		// TODO Auto-generated method stub
    		return super.getPrice() + Obj.cost();
    	}
    
    	public String Description() {
    		return super.description+"-"+super.getPrice()+"&&"+Obj.getDescription();
    	}
    }
    
    package com.coffeebar.decorator;
    
    import com.coffeebar.main.Drink;
    
    public class Chocolate extends Decorator {
    
    	public Chocolate(Drink Obj) {
    		super(Obj);
    		// TODO Auto-generated constructor stub
    		super.setDescription("Chocolate");
    		super.setPrice(3.0f);
    	}
    	
    }
    
    package com.coffeebar.decorator;
    
    import com.coffeebar.main.Drink;
    
    public class Milk extends Decorator {
    
    	public Milk(Drink Obj) {
    		super(Obj);
    		// TODO Auto-generated constructor stub
    		super.setDescription("Milk");
    		super.setPrice(2.0f);
    	}
    
    }
    
    package com.coffeebar.decorator;
    
    import com.coffeebar.main.Drink;
    
    public class Soy extends Decorator {
    
    	public Soy(Drink Obj) {
    		super(Obj);
    		// TODO Auto-generated constructor stub
    		super.setDescription("Soy");
    		super.setPrice(1.5f);
    	}
    
    }
    
    package com.coffeebar.main;
    
    import com.coffeebar.coffee.Decaf;
    import com.coffeebar.coffee.LongBlack;
    import com.coffeebar.decorator.Chocolate;
    import com.coffeebar.decorator.Milk;
    
    public class Coffeebar {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Drink order;
    		order = new Decaf();
    		System.out.println("order1 price: " + order.cost());
    		System.out.println("order1 desc: " +order.getDescription());
    		
    		System.out.println("*******************");
    		order = new LongBlack();
    		order = new Milk(order);
    		order = new Chocolate(order);
    		order = new Chocolate(order);
    		System.out.println("order2 price: " + order.cost());
    		System.out.println("order2 desc: " + order.getDescription());
    	}
    
    }
    

     输出结果

    order1 price: 3.0
    order1 desc: Decaf
    *******************
    order2 price: 13.5
    order2 desc: Chocolate
    



  • 相关阅读:
    8 Range 对象
    7 Worksheet 对象
    6 Workbook 对象
    5 Application 对象
    Windows路径
    windows 下操作目录(使用DOS命令)
    Windows 批处理
    6 WPF控件
    Lexer and parser generators (ocamllex, ocamlyacc)
    4.9 Parser Generators
  • 原文地址:https://www.cnblogs.com/chengzi123/p/4781926.html
Copyright © 2011-2022 走看看