【设计模式】装饰者模式

  • 装饰者模式

    装饰者模式(Decorator Pattern)是指在不改变原有对象的基础之上,将功能附加到对 象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式

  • 例如,平时买煎饼,普通煎饼,可以加鸡蛋,加香肠

  • 定义食物顶层接口

public interface Food {
    String make();
}

  • 定义一个基本煎饼,无添加
public class BaseFood implements Food {

    @Override
    public String make() {
        return "普通煎饼";
    }
}
  • 定义加鸡蛋的装饰器
public class EggDecorator implements Food{

    private Food food;

    public EggDecorator(Food food){
        this.food = food;
    }


    @Override
    public String make() {
       return food.make()+"加一个鸡蛋";
    }
}
  • 定义加香肠装饰器
public class SausageDecorator implements Food{

    private Food food;

    public SausageDecorator(Food food){
        this.food = food;
    }


    @Override
    public String make() {
       return food.make()+"加一个香肠";
    }
}
  • 测试
public class Test {
    public static void main(String[] args){

        Food food =  new EggDecorator(new SausageDecorator(new BaseFood()));
        System.out.println(food.make());


    }
}
  • 输出
普通煎饼加一个香肠加一个鸡蛋
  • 装饰者在代码程序中适用于以下场景:

    1、用于扩展一个类的功能或给一个类添加附加职责。
    2、动态的给一个对象添加功能,这些功能可以再动态的撤销

  • 装饰者模式和适配器模式对比

    装饰者和适配器模式都是包装模式(Wrapper Pattern),装饰者也是一种特殊的代理模式

装饰者模式适配器模式
形式是一种非常特别的适配器模式没有层级关系,装饰器模式有层级关系
定义装饰者和被装饰者都实现同一个接 口,主要目的是为了扩展之后依旧保 留 OOP 关系适配器和被适配者没有必然的联系,通 常是采用继承或代理的形式进行包装
关系满足 is-a 的关系满足 has-a 的关系
功能注重覆盖、扩展注重兼容、转换
设计前置考虑后置考虑
  • 装饰者模式在源码中的应用

    BufferedReader、InputStream、OutputStream

  • 装饰者模式的优缺点

    优点: 1、装饰者是继承的有力补充,比继承灵活,不改变原有对象的情况下动态地给一个对象 扩展功能,即插即用。 2、通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果。 3、装饰者完全遵守开闭原则。

    缺点: 1、会出现更多的代码,更多的类,增加程序复杂性。 2、动态装饰时,多层装饰时会更复杂。 那么装饰者模式我们就讲解到这里,希望小伙伴们认真体会,加深理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EmineWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值