设计模式之装饰器模式

一、装饰器的概念

装饰器模式又名包装模式。动态的给一个对象添加一些额外的职责(侧重的是程序运行时的功能加强,并非子类继承父类时添加新的功能)。就扩展功能而言,它比生成子类的方式更为灵活。对已有的业务逻辑进一步的封装,使其增加额外的功能,如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.当采用生成子类的方法进行扩充时,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值