Java教程

Java设计模式:装饰者模式(Decorator)

本文主要是介绍Java设计模式:装饰者模式(Decorator),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

核心设计

  • 装饰者类:
    1. 引用基础类
    2. 继承基础类(实现基础类的接口)

类图

  • 基础类是 Shape (基础接口)
  • 装饰类通过同时实现基础类接口和引用基础类达到可以继续扩展的目的
  • 原本通过 Shape 类可以画 Circle 和 Rectangle
  • 装饰者类通过引用 Shape 达到了原有的目的,通过 实现 Shape 接口保持自己也具有和 Shape 同样的身份(属性),从而我们在程序中调用 ShapeDecorator 及其子类对象的时候,就可以通过 Shape 类型来接受他们;而不用涉及新的类
    在这里插入图片描述
  • 下面的例子是一个牛肉面的例子:
    • 面是基类接口,主要有 regularNoodle 和 BeefNoodle 这两种面
    • NoodlesDecorator 既实现了 Noodles 接口,又引用了 Noodles 对象;即,他可以在 noodles 本身基础上进行扩展
    • NoodlesDecorator 本身是个抽象类,这就保证了他可以通过子类生成多种多样的 decorator,比如加鸡蛋的面,就是 EggNoodlesDecorator,在加鸡蛋的面里面既可以产出 “加鸡蛋的牛肉面” 也可以产出 “加鸡蛋的普通面”

在这里插入图片描述

代码

package 设计模式.装饰者模式;

public interface Noodles {

    float cost();
    String description();

}

package 设计模式.装饰者模式;

public class BeefNoodles implements Noodles {
    private final float price = 30;
    private String name = "beefNoodles";

    @Override
    public float cost() {
        return price;
    }

    @Override
    public String description() {
        return name;
    }
}

package 设计模式.装饰者模式;

public class RegularNoodles implements Noodles{
    private final float price = 10;
    private String name = "regularNoodles";


    @Override
    public float cost() {
        return price;
    }

    @Override
    public String description() {
        return name;
    }
}

package 设计模式.装饰者模式;

public abstract class NoodlesDecorator implements Noodles {

    protected float price;
    protected Noodles noodles;


    @Override
    public abstract float cost();

    @Override
    public abstract String description();
}

package 设计模式.装饰者模式;

public class EggNoodlesDecorator extends NoodlesDecorator {
    private float eggPrice=3;
    private String name = "egg";

    public EggNoodlesDecorator(Noodles noodles){
        this.noodles = noodles;
    }

    @Override
    public float cost() {
        return eggPrice + noodles.cost();
    }

    @Override
    public String description() {
        return name + noodles.description();
    }
}

package 设计模式.装饰者模式;

import java.util.prefs.NodeChangeEvent;

public class Demo {
    public static void main(String[] args) {
        Noodles beef = new BeefNoodles();
        System.out.println(beef.description());
        Noodles eggbeef = new EggNoodlesDecorator(buf);
        System.out.println(eggbeef.description());
    }
}

这篇关于Java设计模式:装饰者模式(Decorator)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!