装饰着模式

公司门口有一个小摊卖手抓饼和肉夹馍的,有时候中午不想吃饭就会去光顾一下那个小摊,点了手抓饼之后往往还可以在这个基础之上增加一些配料,例如煎蛋,火腿片等等,每个配料的价格都不一样,不管你怎么配配料,最终价格是手抓饼基础价加上每一种所选配料价格的总和。小摊的价格单如下:
在这里插入图片描述

如何使用一种设计模式来处理价格计算的问题呢,或许我们可以试试装饰者模式,因为在这里,主体是手抓饼和肉夹馍,而配料则是装饰者,我先用UML类图来描述一下类之间的协作关系。
在这里插入图片描述

java代码是怎么实现的:

public abstract class Pancake {
    
    public String desc = "我不是一个具体的煎饼";

    public String getDesc() {
        return desc;
    }
    
    public abstract double price();

}
public class TornCake extends Pancake {

    public TornCake() {
        desc = "手抓饼";
    }

    @Override
    public double price() {
        return 4;
    }

}
public class Roujiamo extends Pancake {

    public Roujiamo() {
        desc = "肉夹馍";
    }

    @Override
    public double price() {
        return 6;
    }

}
public abstract class Condiment extends Pancake {

    public abstract String getDesc();

}
public class FiredEgg extends Condiment {
    private Pancake pancake;
    
    public FiredEgg(Pancake pancake) {
        this.pancake = pancake;
    }

    @Override
    public String getDesc() {
        return pancake.getDesc() + ", 煎蛋";
    }

    @Override
    public double price() {
        return pancake.price() + 2;
    }

}
public class Ham extends Condiment {
    private Pancake pancake;
    
    public Ham(Pancake pancake) {
        this.pancake = pancake;
    }

    @Override
    public String getDesc() {
        return pancake.getDesc() + ", 火腿片";
    }

    @Override
    public double price() {
        return pancake.price() + 1.5;
    }

}

MeatFloss类和Cucumber类跟FiredEgg很相似,我就不一一列出来了,最后看看测试类:

public class MyTest {
    
    @Test
    public void test() {
        Pancake tornCake = new TornCake();
        //手抓饼基础价
        System.out.println(String.format("%s ¥%s", tornCake.getDesc(), tornCake.price()));
        
        Pancake roujiamo = new Roujiamo();
        roujiamo = new FiredEgg(roujiamo);
        roujiamo = new FiredEgg(roujiamo);
        roujiamo = new Ham(roujiamo);
        roujiamo = new MeatFloss(roujiamo);
        roujiamo = new Cucumber(roujiamo);
        //我好饿
        System.out.println(String.format("%s ¥%s", roujiamo.getDesc(), roujiamo.price()));
    }

}
在这里插入图片描述
装饰模式可以动态地为一个对象添加额外的功能。该模式定义了一个装饰类,它包装了原始的对象,并提供了额外的功能。 在Java中,实现装饰模式的基本步骤如下: 1. 定义一个抽象组件类,它定义了原始对象和装饰对象的共同接口。 2. 定义一个具体组件类,它实现抽象组件类中定义的方法。 3. 定义一个抽象装饰类,它继承了抽象组件类,并且包含了一个抽象组件的引用。 4. 定义一个具体装饰类,它继承了抽象装饰类,并且实现了抽象组件类中定义的方法,同时还可以添加额外的功能。 5. 在客户端中,创建一个具体组件对象,然后可以用一个或多个装饰对象来包装它,从而动态地为它添加额外的功能。 例如,我们可以定义一个抽象组件类 Shape,它有一个方法 draw(),表示绘制图形。然后定义一个具体组件类 Rectangle,它实现了 Shape 中的 draw() 方法。接着定义一个抽象装饰类 ShapeDecorator,它继承了 Shape,同时包含了一个 Shape 对象的引用。最后定义一个具体装饰类 RedBorderDecorator,它继承了 ShapeDecorator,实现了 Shape 中的 draw() 方法,并且还添加了一个红色的边框。 客户端可以这样使用: ``` Shape rectangle = new Rectangle(); Shape redBorderRectangle = new RedBorderDecorator(new Rectangle()); rectangle.draw(); // 绘制矩形 redBorderRectangle.draw(); // 绘制带红色边框的矩形 ``` 通过装饰模式,我们可以动态地为一个对象添加新的功能,而不需要修改原始对象的代码。这使得代码更加灵活、可扩展和易维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值