Java设计模式之装饰器模式

1. 装饰器模式概述
  • 装饰器模式能够动态地为对象添加功能,基于对象组合的方式,将复杂的功能简单化、分散化,然后在运行期间根据需要进行动态组合
  • 装饰器模式的类图如下:
    在这里插入图片描述
  1. 抽象组件(Componet): 定义一个接口或抽象类,具体构件和装饰器都要实现该接口,以便动态添加职责。
  2. 具体组件(ConcreteComponet): 具体的组件类,实现抽象组件接口。
  3. 装饰器(Decorator): 装饰器类,实现抽象组件接口,继承基本共能。
  4. 具体装饰器(ConcreteDecorator): 具体装饰器类,继承装饰器类,添加具体的功能。
  • 举个例子:
  1. 手抓饼有很多组合,张三家原始的手抓饼就是一张面皮,之后可以根据个人喜好去添加鸡蛋、培根、脆皮、肉松等配料。
  2. 这时可以将手抓饼定义为抽象接口,创建具体的手抓饼类完成面皮的制作。然后创建装饰器类,具体装饰器分别为鸡蛋、肉松、脆皮、培根等。通过对象组合,可以根据个人喜好添加配料。
2. 装饰器模式的编程实例
  • 装饰器模式的建立过程:
  1. 创建一个接口作为抽象组件。
  2. 创建一个具体组件类,需要实现抽象组件接口。
  3. 创建装饰器类,需要实现抽象组件接口,将抽象组件对象作为内部属性,以便进行请求传递。
  4. 创建多个具体装饰器类,继承装饰器类,通过super关键字传递请求。
  • 根据上面对手抓饼的描述,通过装饰器模式实现一个添加了鸡蛋、脆皮的手抓饼和全部都加的哈破话手抓饼。
// 创建抽象组件接口
interface ICake{
    void cook();
}
// 创建具体组件类
class ZhangsanCake implements ICake{
    @Override
    public void cook() {
        System.out.println("您的手抓饼");
    }
}
// 创建装饰器类
class DosageDecorator implements ICake{
    private ICake cake;

    public DosageDecorator(ICake cake){
        this.cake=cake;
    }

    @Override
    public void cook() {
        cake.cook();
    }
}
// 创建具体装饰器类
class EggDDecorator extends DosageDecorator{
    public EggDDecorator(ICake cake) {
        super(cake);
    }

    public void cook(){
        super.cook();
        System.out.println("加鸡蛋");
    }
}
class CuipiDDecorator extends DosageDecorator{
    public CuipiDDecorator(ICake cake) {
        super(cake);
    }

    public void cook(){
        super.cook();
        System.out.println("加脆皮");
    }
}

class PeigenDDecorator extends DosageDecorator{
    public PeigenDDecorator(ICake cake) {
        super(cake);
    }
    public void cook(){
        super.cook();
        System.out.println("加培根");
    }
}
public class DecaratorTest {
    public static void main(String[] args){
        // 创建具体组件对象
        ICake cake=new ZhangsanCake();
        // 创建鸡蛋+脆皮的手抓饼
        ICake cake1=new EggDDecorator(new CuipiDDecorator(cake));
        cake1.cook();
        // 创建豪华手抓饼
        ICake cake2=new PeigenDDecorator(new EggDDecorator(new CuipiDDecorator(cake)));
        cake2.cook();
    }
}
3. 装饰器模式总结
① 装饰器模式的优缺点
  • 优点:
    能够更灵活的扩展对象功能: 装饰器模式和继承都是为了扩展对象的功能,但装饰器模式更灵活,根据需要进行动态组合。
  • 缺点:
  1. 装饰器模式会产生比继承关系更多的对象,大量的小对象占据内存,一定程度上影响性能
  2. 装饰器模式容易出错,大量的小对象使得错误不易排查。
② 装饰器模式在I/O中的应用
  • 装饰器模式最著名的是Java的I/O标准库:
  1. 抽象组件:InputStream/OutputStream
  2. 具体组件:FileInputStream/FileOutputStream
  3. 装饰器:FilterInputStream/FilterOutputStream
  4. 具体装饰器:BufferedInputStream/BufferedOutputStream
③ 装饰器模式与代理模式的区别
  • 二者的目的不同:
  1. 装饰器模式可以在不改变接口的前提下,动态组合或新增对象的功能。即新增对象功能
  2. 代理模式可以在不改变接口的前提下,为对象提供一种代理以控制对该对象的访问。即控制访问
  • 二者的侧重不同:
  1. 装饰器模式侧重于增强,通过动态组合使对象的功能得到扩展。
  2. 代理模式侧重于代理,通过代理对象间接访问目标对象,达到访问控制的目的。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值