java实现23种设计模式-装饰者模式

简介: java实现23种设计模式-装饰者模式
一,定义

动态的将新功能附加到对象上。在对新功能扩展方面,他比继承更具有弹性

装饰者模式也体现了开闭原则

顾名思义,装饰者模式就像一个包装一个快递一样的包装盒

二,以饮料为例,来讲解什么是装饰者模式

假设有一个饮料drink抽象类,实现coffee咖啡与不同点心的搭配问题,如上图。

以面向对象的思想。肯定是每个对象为一个类。假设每个人都是点一份咖啡和一些点心时。假设我们就以简单的组合的方式,那么就肯定有n种组合,并且根据种类的不同,以及份数的不同,就更加的增加了代码的臃肿性

接下来就需要使用到装饰者模式了,我们就将这个点心作为被装饰者,那么就只需要考虑点心了。因此给点心一个装饰类,比如需要一份咖啡和一份牛奶和一份巧克力,如下图,只需要层层包装即可

20210205020100493.png

20210205015328872.png


三,代码
drink类
public abstract class Drink {
    public String des;
    private float price = 0.0f;
    public String getDes() {
        return des;
    }
    public void setDes(String des) {
        this.des = des;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    //计算费用的抽象方法
    public abstract float cost();
}

coffee类

public class Coffee extends Drink {
    @Override
    public float cost() {
        return super.getPrice();
    }
}
public class LongBlack extends Coffee {
    public LongBlack(){
        setDes("美式咖啡");
        setPrice(3.0f);
    }
}
public class Espresso extends Coffee {
    public Espresso(){
        setDes("意大利咖啡");
        setPrice(6.0f);
    }
}

装饰者类 Decorator 类

public class Decorator extends Drink {
    private Drink obj;
    public Decorator(Drink obj){
        this.obj = obj;
    }
    @Override
    public float cost() {
        return super.getPrice() + obj.cost();
    }
    @Override
    public String getDes() {
        return super.des + " " + super.getPrice()+ "&&" + obj.getDes();
    }
}
点心类

豆浆类 Soy

public class Soy extends Decorator {
    public Soy(Drink obj) {
        super(obj);
        setDes("豆浆");
        setPrice(1.5f);
    }
}

牛奶类 Milk

public class Milk extends Decorator {
    public Milk(Drink obj) {
        super(obj);
        setDes("牛奶");
        setPrice(2.0f);
    }
}

巧克力类 chocolate

public class Chocolate extends Decorator {
    public Chocolate(Drink obj) {
        super(obj);
        setDes("巧克力");
        setPrice(3.0f);     //调味品价格
    }
}
四,测试类 CofferBar
public class CofferBar {
    public static void main(String[] args) {
        //1,先点一份LongBlack
        Drink order = new LongBlack();  //费用一
        System.out.println(order.cost());
        //2,加入一份牛奶
        order = new Milk(order);
        System.out.println(order.cost());
        System.out.println(order.getDes());
        //3,加入一份巧克力
        order = new Chocolate(order);
        System.out.println(order.cost());
        System.out.println(order.getDes());
    }
}

如图

这样的话就完美的解决了咖啡和点心的组合了。当然由于每个人是点一份咖啡和多份点心的,因此需要不同的咖啡就需要创建不同的的 coffee 对象即可了!

相关文章
|
21天前
|
设计模式 Java 开发者
设计模式揭秘:Java世界的七大奇迹
【4月更文挑战第7天】探索Java设计模式:单例、工厂方法、抽象工厂、建造者、原型、适配器和观察者,助你构建健壮、灵活的软件系统。了解这些模式如何提升代码复用、可维护性,以及在特定场景下的应用,如资源管理、接口兼容和事件监听。掌握设计模式,但也需根据实际情况权衡,打造高效、优雅的软件解决方案。
|
22天前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
35 4
|
22天前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
32 4
|
21天前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
|
1天前
|
设计模式 消息中间件 Java
Java 设计模式:探索发布-订阅模式的原理与应用
【4月更文挑战第27天】发布-订阅模式是一种消息传递范式,被广泛用于构建松散耦合的系统。在 Java 中,这种模式允许多个对象监听和响应感兴趣的事件。
8 2
|
1天前
|
设计模式 算法 Java
Java 设计模式:探索策略模式的概念和实战应用
【4月更文挑战第27天】策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在 Java 中,策略模式通过定义一系列的算法,并将每一个算法封装起来,并使它们可以互换,这样算法的变化不会影响到使用算法的客户。
6 1
|
1天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
4天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
4天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
|
4天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式