IO常用类体系
装饰者模式:动态的给对象添加一些额外的职责,就增加功能而言,Decorator模式相比生成子类更为灵活,该模式以对客户端透明的方式拓展对象的功能,适用环境:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加一些职责,处理那些可以册小的职责。当不能采用生成类的方法进行扩充是,一种情况是有大量独立的拓展,为支持每一种组合将产生大量的子类,使子类数目呈爆炸性增长。另一种是类定义被隐藏,或类定义不能用于生成子类。
装饰者模式有四种角色:被装饰者对象基类Compont,具体被装饰对象ConcreteComponent,装饰者抽象类Decorator,工具装饰者ConcreteDecorator
case:设计一个自动计算豆浆加料的结账系统:
package com.lx21;
//纯豆浆
public class SoyabBeanMilk implements drink{
@Override
public float cost() {
// TODO Auto-generated method stub
return 5f;
}
@Override
public String description() {
// TODO Auto-generated method stub
return "纯豆浆";
}
}
//加糖修饰
package com.lx21;
public class SugarDecorator extends Decorator{
public SugarDecorator(drink drink) {
super(drink);
}
public float cost() {
return super.cost()+1f;
}
public String description() {
return super.description()+"加糖";
}
}
//加蛋修饰
package com.lx21;
public class EggDecorator extends Decorator{
public EggDecorator(drink drink) {
super(drink);
}
public float cost() {
return super.cost()+2f;
}
public String description() {
return super.description()+"加鸡蛋";
}
}
//加豆修饰
package com.lx21;
public class BeanDecorator extends Decorator{
public BeanDecorator(drink drink) {
super(drink);
}
public float cost() {
return super.cost()+1f;
}
public String description() {
return super.description()+"加豆";
}
}
//主程序
package com.lx21;
public class drinktest {
public static void main(String[] args) {
drink drink = new SoyabBeanMilk();
SugarDecorator surgar =new SugarDecorator(drink);
BeanDecorator bean = new BeanDecorator(surgar);
EggDecorator egg = new EggDecorator(bean);
System.out.println("您点的豆浆套餐是:"+egg.description()+",一共花费"+egg.cost()+"rmb");
}
}
装饰者模式的应用场景为不改变原来类结构的基础上,新增或者限制或者改造功能。