一、装饰器的概念
装饰器模式又名包装模式。动态的给一个对象添加一些额外的职责(侧重的是程序运行时的功能加强,并非子类继承父类时添加新的功能)。就扩展功能而言,它比生成子类的方式更为灵活。对已有的业务逻辑进一步的封装,使其增加额外的功能,如Java中的IO流就使用了装饰器模式,用户在使用的时候,可以任意组装,达到自己想要的效果。
//被装饰类(父类)
public class Food {
private String food_name;
public Food(){
}
public Food(String food_name){
this.food_name=food_name;
}
public String make(){
return food_name;
}
}
/**
* 面包类(装饰类)
*/
public class Bread extends Food {
private Food basic_food;
public Bread(Food basic_food){
this.basic_food=basic_food;
}
public String make(){
return basic_food.make()+"面包";
}
}
/**
* 奶油类
*/
public class Cream extends Food{
private Food basic_food;
public Cream(Food basic_food) {
this.basic_food = basic_food;
}
public String make() {
return basic_food.make()+"+奶油";
}
}
/**
* 蔬菜类
*/
public class Vegetable extends Food{
private Food basic_food;
public Vegetable(Food basic_food) {
this.basic_food = basic_food;
}
public String make() {
return basic_food.make()+"+蔬菜";
}
}
/**
* 这几个类(Bread、Cream、Vegetable)都是差不多的,构造方法传入一个Food类型的参数,
* 然后在make方法中加入一些自己的逻辑
*/
public class Test {
public static void main(String[] args) {
Food food = new Bread(new Vegetable(new Cream(new Food("香肠"))));
System.out.println(food.make());
}
}
结果:
香肠+奶油+蔬菜面包
二、IO体系中的装饰者模式
三、装饰器模式的优点和缺点
装饰者模式的优点(记住前面两个就行)
1.目的在于扩展对象的功能。装饰者模式提供比继承更好的灵活性。装饰是动态的,运行时可以修改的;继承时静态的,编译期便已确定好。
2.通过使用不同的装饰类及对它们的排列组合,可以创造出许多不同行为的组合。
3.装饰类和被装饰类可以独立发展,不会相互耦合
装饰者模式的缺点
1.产生很多的小对象,大量的小对象会占用内存
2.组合方式很多,很容易出错
四、装饰器模式的适应场景
1.以动态的方式给对象添加职责
2.处理那些可以撤销的职责
3.当采用生成子类的方法进行扩充时,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长