Java设计模式之装饰者模式

本文通过煎饼制作的实例,详细解析Java装饰者模式的应用。从简单的煎饼开始,逐步添加鸡蛋、香肠等配料,展示如何使用装饰者模式灵活地增加功能,避免类爆炸,提高代码的可扩展性和复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java设计模式之装饰者模式

先考虑这样一个生活场景,煎饼摊前面有三个人饿了要买煎饼,第一个只要煎饼,第二个煎饼加鸡蛋,第三个煎饼加鸡蛋加香肠。下面看代码实现。

//新建一个类 煎饼
public class Battercake {
    public String getDesc(){
        return "煎饼";
    }
    public int price(){
        return 5;
    }

}


//新建类 煎饼 加鸡蛋
public class BattercakeWithEgg extends Battercake {

    @Override
    public String getDesc() {
        return super.getDesc() +" 加一个鸡蛋";
    }

    @Override
    public int price() {
        return super.price() + 1;
    }
}


//新建类  煎饼 加鸡蛋 加香肠
public class BattercakeWithEggSausage extends BattercakeWithEgg {
    @Override
    public String getDesc() {
        return super.getDesc() +" 加一根香肠";
    }

    @Override
    public int price() {
        return super.price() + 2;
    }
}

//调用
 public static void main(String [] a){
        Battercake battercake=new Battercake();
        System.out.println(battercake.getDesc()+";价格:"+battercake.price());

        Battercake battercake2=new BattercakeWithEgg();
        System.out.println(battercake2.getDesc()+";价格:"+battercake2.price());

        Battercake battercake3=new BattercakeWithEggSausage();
        System.out.println(battercake3.getDesc()+";价格:"+battercake3.price());
    }

//结果
煎饼;价格:5
煎饼 加一个鸡蛋;价格:6
煎饼 加一个鸡蛋 加一根香肠;价格:8


看一下UML的类图:

现在如果来了第四个人想买煎饼加2个蛋一根香肠或者煎饼加1个蛋两根香肠呢?再考虑其他的组合呢?此时代码的扩展性很差,很容易导致类爆炸。

下面看看装饰者模式怎么优雅的应对这种局面。

抽象的实体类,确定的实体类,抽象的装饰者,确定的装饰者。被装饰者是煎饼,装饰者是鸡蛋和香肠。

//抽象的煎饼
public abstract class ABattercake {
    public abstract String getDesc();
    public abstract int price();
}

//实体的煎饼
public class Battercake extends ABattercake{
    @Override
    public String getDesc() {
        return "煎饼";
    }

    @Override
    public int price() {
        return 5;
    }
}

//抽象的装饰者继承抽象的煎饼
public class ADecorator extends ABattercake{
    private ABattercake aBattercake;

    //把要被装饰的抽象类作为构造的入参
    public ADecorator(ABattercake aBattercake) {
        this.aBattercake = aBattercake;
    }

    @Override
    public String getDesc() {
        return this.aBattercake.getDesc();
    }

    @Override
    public int price() {
        return this.aBattercake.price();
    }
}

//鸡蛋 实体装饰者
public class EggDecorator extends ADecorator{
    public EggDecorator(ABattercake aBattercake) {
        super(aBattercake);
    }

    @Override
    public String getDesc() {
        return super.getDesc()+" 加一个鸡蛋";
    }

    @Override
    public int price() {
        return super.price() + 1;
    }
}

//香肠 实体装饰者
public class SuasageDecorator extends ADecorator{
    public SuasageDecorator(ABattercake aBattercake) {
        super(aBattercake);
    }

    @Override
    public String getDesc() {
        return super.getDesc()+" 加一根香肠";
    }

    @Override
    public int price() {
        return super.price() + 2;
    }
}

//调用
public static void main(String [] a){
        ABattercake aBattercake;
        aBattercake=new Battercake();
        aBattercake=new EggDecorator(aBattercake);
        aBattercake=new EggDecorator(aBattercake);
        aBattercake=new SuasageDecorator(aBattercake);
        System.out.println(aBattercake.getDesc()+"; 价格:"+aBattercake.price());

    }

//结果
煎饼 加一个鸡蛋 加一个鸡蛋 加一根香肠; 价格:9

看看此时UML的类图:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值