栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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());
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/294967.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号