唐宋元明清 唐宋元明清
首页
  • 基础

    • Java基础
  • 工具

    • hutool
    • commons
  • 框架

    • Spring Boot相关
  • 设计模式

    • 设计模式入门
  • Hadoop

    • Hadoop分布式搭建
    • Hadoop高可用搭建
    • 集群端口
    • 代码demo
  • Zookeeper

    • Zookeeper集群搭建
  • Hive

    • Hive集群搭建
    • Hive相关
    • HSQL
  • Kafka

    • Kafka集群搭建
  • HBase

    • HBase集群搭建
    • HBase基础学习
  • Spark

    • Spark环境搭建
    • Spark相关知识
  • Flink

    • Flink环境搭建
    • Flink学习
  • Flume

    • Flume安装配置
    • Flume高可用集群安装
    • Flume相关学习
  • Sqoop

    • Sqoop安装配置
    • Sqoop使用
  • 其他

    • docker
  • Oracle

    • Oracle相关知识杂记
    • 系统函数篇
    • 与MySQL语法区别
  • MySQL

    • MySQL知识点
  • Python

    • Python简单语法
    • Python操作Office
    • Python类库学习
    • Python爬虫
  • Shell

    • Shell基础
    • Shell命令行
  • Scala

    • 语法学习
  • 正则表达式

    • 正则基础
  • 调度

    • 调度工具
  • 前端

    • 前端相关
  • 杂记

    • 常用工具或网站
    • 琐碎知识
  • 摘录

    • 摘录
GitHub (opens new window)
首页
  • 基础

    • Java基础
  • 工具

    • hutool
    • commons
  • 框架

    • Spring Boot相关
  • 设计模式

    • 设计模式入门
  • Hadoop

    • Hadoop分布式搭建
    • Hadoop高可用搭建
    • 集群端口
    • 代码demo
  • Zookeeper

    • Zookeeper集群搭建
  • Hive

    • Hive集群搭建
    • Hive相关
    • HSQL
  • Kafka

    • Kafka集群搭建
  • HBase

    • HBase集群搭建
    • HBase基础学习
  • Spark

    • Spark环境搭建
    • Spark相关知识
  • Flink

    • Flink环境搭建
    • Flink学习
  • Flume

    • Flume安装配置
    • Flume高可用集群安装
    • Flume相关学习
  • Sqoop

    • Sqoop安装配置
    • Sqoop使用
  • 其他

    • docker
  • Oracle

    • Oracle相关知识杂记
    • 系统函数篇
    • 与MySQL语法区别
  • MySQL

    • MySQL知识点
  • Python

    • Python简单语法
    • Python操作Office
    • Python类库学习
    • Python爬虫
  • Shell

    • Shell基础
    • Shell命令行
  • Scala

    • 语法学习
  • 正则表达式

    • 正则基础
  • 调度

    • 调度工具
  • 前端

    • 前端相关
  • 杂记

    • 常用工具或网站
    • 琐碎知识
  • 摘录

    • 摘录
GitHub (opens new window)
  • Java相关知识
  • 基础

    • Java基础
    • Java扩展
  • 工具

    • hutool工具包
    • Commons类库
    • SQL解析工具
  • 框架

    • Spring Boot相关
  • 设计模式

    • 设计模式入门
    • 策略模式
    • 观察者模式
    • 装饰者模式
      • 装饰者模式(Decorator Pattern)
        • 咖啡订单系统
        • 第一次尝试
        • 设计
        • 关键点
        • 类图
        • 代码实现
        • Java API中的装饰者模式(IO流)
        • 要点
    • 工厂模式
    • 单例模式
    • 命令模式
    • 适配器模式与外观模式
    • 模板方法模式
    • 迭代器与组合模式
    • State 模式
    • 代理模式
  • Java相关
  • 设计模式
Ai
2022-07-15
目录

装饰者模式

# 装饰者模式(Decorator Pattern)

装饰者模式 动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

# 咖啡订单系统

# 第一次尝试

Beverage(饮料)类作为抽象类,每个子类都实现 Beverage 类中的 cost方法。但由于购买咖啡时,可以再其中加入蒸奶、豆浆等调料,所以订单系统需要考虑加入不同调料的价格,导致类呈爆炸性增长。

# 设计
# 关键点
  • 装饰者和被装饰对象有相同的父类。
  • 你可以用一个或多个装饰者包装一个对象。
  • 既然装饰者和被装饰对象有相同的父类,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它。
  • 装饰者可以在所委托被装饰者的行为之前与(或)之后,加上自己的行为,以达到特定的目的。
  • 对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。
# 类图

# 代码实现

    public abstract class Beverage {
        String description = "未知的饮料";
    
        public String getDescription() {
            return description;
        }
    
        public abstract double cost();
    }
    -------------------------------------------------------
    public class HouseBlend extends Beverage {
        public HouseBlend() {
            description = "HouseBlend";
        }
    
        @Override
        public double cost() {
            return 1;
        }
    }
    -------------------------------------------------------
    public class DarkRoast extends Beverage {
    
        public DarkRoast() {
            description = "DarkRoast";
        }
    
        @Override
        public double cost() {
            return 2;
        }
    }
    -------------------------------------------------------
    public class Espresso extends Beverage {
        public Espresso() {
            description = "Espresso";
        }
    
        @Override
        public double cost() {
            return 3;
        }
    }
    -------------------------------------------------------
    public class Decaf extends Beverage {
        public Decaf() {
            description = "Decaf";
        }
    
        @Override
        public double cost() {
            return 4;
        }
    }
    
    public abstract class CondimentDecorator extends Beverage {
        @Override
        public String getDescription() {
            return super.getDescription();
        }
    }
    -------------------------------------------------------
    public class Milk extends CondimentDecorator {
    
        Beverage beverage;
    
        public Milk(Beverage beverage) {
            this.beverage = beverage;
        }
    
        @Override
        public double cost() {
            return beverage.cost() + 0.1;
        }
    
        @Override
        public String getDescription() {
            return beverage.getDescription() + ",Milk";
        }
    }
    -------------------------------------------------------
    public class Mocha extends CondimentDecorator {
    
        Beverage beverage;
    
        public Mocha(Beverage beverage) {
            this.beverage = beverage;
        }
    
        @Override
        public double cost() {
            return beverage.cost() + 0.2;
        }
    
        @Override
        public String getDescription() {
            return beverage.getDescription() + ",Mocha";
        }
    }
    -------------------------------------------------------
    public class Soy extends CondimentDecorator {
    
        Beverage beverage;
    
        public Soy(Beverage beverage) {
            this.beverage = beverage;
        }
    
        @Override
        public double cost() {
            return beverage.cost() + 0.3;
        }
    
        @Override
        public String getDescription() {
            return beverage.getDescription() + ",Soy";
        }
    }
    -------------------------------------------------------
    public class Whip extends CondimentDecorator {
    
        Beverage beverage;
    
        public Whip(Beverage beverage) {
            this.beverage = beverage;
        }
    
        @Override
        public double cost() {
            return beverage.cost() + 0.4;
        }
    
        @Override
        public String getDescription() {
            return beverage.getDescription() + ",Whip";
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Beverage darkRoast = new DarkRoast();
            darkRoast = new Milk(darkRoast);
            darkRoast = new Mocha(darkRoast);
            darkRoast = new Soy(darkRoast);
    
            System.out.println("商品:" + darkRoast.getDescription() + "\n价格:" + darkRoast.cost());
    
            Beverage espresso = new Espresso();
            espresso = new Milk(espresso);
            espresso = new Whip(espresso);
    
            System.out.println("商品:" + espresso.getDescription() + "\n价格:" + espresso.cost());
        }
    }
    
    // Make sure to add code blocks to your code group

    # Java API中的装饰者模式(IO流)

    # 要点

    • 继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式。
    • 在我们的设计中,应该允许行为可以被扩展,而无须修改现有的代码。
    • 组合和委托可用于在运行时动态地加上新的行为。
    • 除了继承,装饰者模式也可以让我们扩展行为。
    • 装饰者模式意味着一群装饰者类,这些类用来包装具体组件。
    • 装饰者类反映出被装饰的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现)。
    • 装饰者可以在被装饰者的行为前面与(或)后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特的目的。
    • 你可以用无数个装饰者包装一个组件。
    • 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。
    • 装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。
    编辑 (opens new window)
    上次更新: 2022/07/15, 18:03:14
    观察者模式
    工厂模式

    ← 观察者模式 工厂模式→

    Theme by Vdoing | Copyright © 2022-2025 Ai | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×