装饰者模式

简介: 装饰者模式

装饰者模式:

意图:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更为灵活,该模式以对客户端透明的方式扩展对象的功能

适用环境:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

通俗来讲,比如我们开个饮品店,主要卖牛奶,但是由于不同的需要,有的需要牛奶+糖,有的需要牛奶+珍珠,有的需要牛奶+冰等等等等,当然不同的方式,所需要的价格不一样,我们怎么办,每一种方式都写一个实现类嘛,这样实现类只会越来越多,这是我们就需要一个装饰类来处理这种事情,饮品店和牛奶就是我们被装饰的接口和被装饰的类,是比较抽象哈,上代码。

被装饰的接口

public interface Milk {
    /**
     * 计算价格
     */
    float price();
    /**
     * 牛奶成分的描述
     */
    String describe();
}

被装饰的类:

public class DrinkMilk implements Milk {
    @Override
    public float price() {
        return 10f;
    }
    @Override
    public String describe() {
        return "牛奶";
    }
}

具体的装饰类:

public abstract class Decorator implements Milk {
    private final Milk milk;
    public Decorator(Milk milk) {
        this.milk = milk;
    }
    @Override
    public float price() {
        return milk.price();
    }
    @Override
    public String describe() {
        return milk.describe();
    }
}

比如加鸡蛋(我们只需要继承这个装饰类就可以了)

public class Egg extends Decorator {
    public Egg(Milk milk) {
        super(milk);
    }
    @Override
    public float price() {
        return super.price() + 2;
    }
    @Override
    public String describe() {
        return super.describe() + "加鸡蛋";
    }
}

同样,比如加珍珠

public class Pearl extends Decorator {
    public Pearl(Milk milk) {
        super(milk);
    }
    @Override
    public float price() {
        return super.price() + 2;
    }
    @Override
    public String describe() {
        return super.describe() + "加珍珠";
    }
}

测试代码

public class Test1 {
    public static void main(String[] args) {
        // 一杯牛奶
        Milk milk = new DrinkMilk();
        // 加鸡蛋
        Egg egg = new Egg(milk);
        // 加珍珠
        Pearl pearl = new Pearl(egg);
        System.out.println(pearl.price());// 14.0
        System.out.println(pearl.describe());//牛奶加鸡蛋加珍珠
    }
}


目录
相关文章
|
6月前
结构型 装饰器模式
结构型 装饰器模式
32 0
|
6月前
|
设计模式 Java
Java设计模式【十】:装饰者模式
Java设计模式【十】:装饰者模式
50 0
|
28天前
|
设计模式 缓存 C#
C# 一分钟浅谈:装饰者模式与代理模式
【10月更文挑战第12天】本文介绍了面向对象编程中的两种常见设计模式:装饰者模式和代理模式。装饰者模式允许在运行时动态地给对象添加功能,而代理模式则通过代理对象控制对另一个对象的访问。文章详细讲解了这两种模式的概念、常见问题、如何避免问题以及代码示例,帮助读者更好地理解和应用这些设计模式。
35 13
打扮一下(装饰模式)
打扮一下(装饰模式)
63 0
|
Java
结构型模式-装饰者模式
结构型模式-装饰者模式
88 0
|
设计模式 Java uml
Java设计模式-装饰者模式
Java设计模式-装饰者模式
Java设计模式-装饰者模式
装饰者模式详解
装饰者模式详解
|
缓存 Java 数据库连接
深入理解装饰者模式
深入理解装饰者模式
156 0
深入理解装饰者模式