其他分享
首页 > 其他分享> > 设计模式系列之装饰模式(Decorator Pattern)

设计模式系列之装饰模式(Decorator Pattern)

作者:互联网

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。我们通过下面的实例来演示装饰器模式的用法。我们的实例是实现餐馆点餐点,基础食物:米饭,你可以搭配啤酒,可乐.鱼或者蔬菜.

注意事项:可代替继承。

代码示例

如上面所说,我们要实现参观点餐的需求,使用啤酒.鱼等辅助食材来装饰米饭(Rich)对象,要求这些材料具有相同的基类,那么下面我们先定义Beverage(材料类).

package com.zhoutao123.design.pattern.decorator;


/**
 * 材料
 */
public abstract class Beverage {

    private String desc = "未知食材";

    // 抽象方法,返回价钱
    public abstract float getCost();

    // 返回描述
    public  String getDesc(){
        return desc;
    }
}

然后我们定义米饭,米饭需要继承Beverage类

package com.zhoutao123.design.pattern.decorator;

/**
 * 定义米饭
 */
public class Rice extends Beverage{

    @Override
    public String getDesc() {
        return "米饭,";
    }

    @Override
    public float getCost() {
        return 12;
    }
}

定义一些其他食材.

package com.zhoutao123.design.pattern.decorator;

/**
 * 定义啤酒
 */
public class Beer extends Beverage {

    private Beverage beverage;

    public Beer(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public String getDesc() {
        return beverage.getDesc()+"Beer,";
    }

    @Override
    public float getCost() {
        return 0.2f + beverage.getCost();
    }
}

剩下的重复性动作就不在定义了,可以仿照Beer一次实现Cola(可乐) Fish(鱼) Vegetable(蔬菜)由于这是示例,代码比较简单,就不做过多的说明了,大致可以看下UML

装饰模式示例-关系继承图.png

下面看一些测试代码,可以看到可以使用随意的商品修饰Rich,而不用担心耦合.基础Rich需要什么,我么就可以去装饰它.

package com.zhoutao123.design.pattern.decorator;

/**
 * 测试装饰者模式
 */
public class TestDecorator {

    public static void main(String[] args) {
        // 首先定义米饭
        System.out.println("------------一个普通的晚餐订单---------------");
        Beverage beverage = new Rice();

        //分别用啤酒,可乐和鱼等食物装饰米饭
        // 得到一份晚餐
        beverage = new Beer(beverage);
        beverage = new Fish(beverage);
        beverage = new Cola(beverage);

        // 显示晚餐列表
        System.out.println(beverage.getDesc());
        // 显示晚餐总金额
        System.out.println(beverage.getCost());



        // 一位素食主义者的订单
        System.out.println("------------一位素食主义者的订单---------------");
        Beverage food = new Rice();
        food = new Vegetables(food);
        // 计算价钱和想清单
        // 显示晚餐列表
        System.out.println(food.getDesc());
        // 显示晚餐总金额
        System.out.println(food.getCost());
    }

}

结果如下,(float类型产生的误差请忽略):

------------一个普通的晚餐订单---------------
米饭,啤酒,红烧鱼,可乐,
13.400001
------------一位素食主义者的订单---------------
米饭,Vegetables,
12.5

标签:Pattern,getCost,装饰,Beverage,米饭,设计模式,public,Decorator,beverage
来源: https://www.cnblogs.com/zhoutao825638/p/10382264.html