java设计模式——结构型模式——装饰者模式

本文详细介绍了装饰者模式,一种用于动态增加对象职责的结构型模式。装饰者模式包括抽象构件角色、具体构件角色和抽象装饰角色等组件,通过实例展示了如何使用装饰者模式为FastFood类添加额外的Garnish装饰。同时,文章还对比了装饰者模式与静态代理模式的异同,强调两者在增强目标对象和获取目标对象方式上的区别。
摘要由CSDN通过智能技术生成

结构型模式——装饰者模式

装饰者模式概述

指在不改变现有对象结构的情况下,动态地给改对象增加一些职责的结构性模式。

装饰者模式结构

装饰者模式包括:

  • 抽象构件角色:定义一个抽象接口以规范准备接收附加责任的对象。
  • 具体构件角色:实现抽象构件,通过装饰角色为其添加一些职责。
  • 抽象装饰角色:继承或实现抽象构件,并包含具体构件的实例,可以通过其子类口站
  • 具体装饰角色

装饰者模式实现

装饰者模式中各个角色的关系是这样的:“抽象构件角色”是整个装饰者模式中基础,这个“抽象构件角色”被很多“具体构件角色”继承。装饰类都是在“具体构件角色”的基础上进行装饰的。“抽象装饰角色”是整个装饰者模式中的核心类,他继承“抽象构件角色”,又聚合“抽象构件角色”,在“抽象装饰角色”被很多“具体装饰角色“继承,这些“具体装饰角色”在构件是会传入“抽象构件角色”的子类,并对其进行修改。

/**
 * FastFood是抽象构件角色
 */
public abstract class FastFood {
    private float price;
    private String desc;

    public FastFood() {
    }

    public FastFood(float price, String desc) {
        this.price = price;
        this.desc = desc;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public abstract float cost();
}
/**
 * FiredNoodles、FriedRice是具体构件角色
 */
public class FiredNoodles extends FastFood{

    public FiredNoodles(){
        super(12,"炒面");
    }

    @Override
    public float cost() {
        return getPrice();
    }
}
public class FriedRice extends FastFood{

    public FriedRice(){
        super(10,"炒饭");
    }
    @Override
    public float cost() {
        return  getPrice();
    }
}
/**
 * Garnish睡觉是抽象装饰角色,也是装饰者模式的核心
 */
public abstract class Garnish extends FastFood{

    private FastFood fastFood;

    public FastFood getFastFood(){
        return fastFood;
    }

    public void setFastFood(FastFood fastFood) {
        this.fastFood = fastFood;
    }

    public Garnish(FastFood fastFood,float price,String desc){
        super(price,desc);
        this.fastFood = fastFood;
    }
}
/**
 * egg、bacon是具体装饰角色
 */
public class Egg extends Garnish{

    public Egg(FastFood fastFood){
        super(fastFood,1,"鸡蛋");
    }

    public float cost(){
        return getPrice()+ getFastFood().cost();
    }
    @Override
    public String getDesc() {
        return super.getDesc()+getFastFood().getDesc();
    }
}
public class Bacon extends Garnish{

    public Bacon(FastFood fastFood){
        super(fastFood,2,"培根");
    }

    @Override
    public float cost() {
        return getPrice() + getFastFood().cost();
    }

    @Override
    public String getDesc(){
        return super.getDesc()+getFastFood().getDesc();
    }
}

代理模式和装饰者模式模式的相同点与不同点

相同点:

  • 静态代理模式和装饰者模式核心类都要实现目标类的业务接口,
  • 同时都需在核心类中声明目标对象。
  • 都可以在不改变目标类的前提下增强目标方法。
    不同点:
  • 目的不同,静态代理模式是为了增强目标对象,静态代理是为了保护和隐藏目标对象。
  • 获取目标对象构件的地方不同,装饰者是由外界传递进来,静态代理是在核心类的内部创建。也就是说,虽然都要声明目标对象,但是静态代理在类的内部直接将目标对象new出来,而装饰者模式有外部业务代码传入目标对象,并将其进行修改。

文章内容为个人学习总结,如有错误望指正。
参考链接https://www.bilibili.com/video/BV1Np4y1z7BU

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值