解决的问题:

对象的扩展问题:

package cn.echo42.decorator;

/**
* @author DaiZhiZhou
* @file Netty
* @create 2020-07-29 16:49
*/
public class Client { public static void main(String[] args) {
Phone huaweiP30 = new Huawei();
huaweiP30.function();
System.out.println(huaweiP30.price()); huaweiP30 = new MediaPlayerPhoneDecorator(huaweiP30);
huaweiP30.function();
System.out.println(huaweiP30.price()); huaweiP30 = new ShotPhoneDecorator(huaweiP30);
huaweiP30.function();
System.out.println(huaweiP30.price()); // 单件购买也可以
Phone phone = new MediaPlayerPhoneDecorator();
System.out.println(phone);
} interface Phone {
int price();
void function();
} static class Huawei implements Phone {
@Override
public int price() {
return 1000;
} @Override
public void function() {
System.out.println("华为手机的基础功能");
}
} interface PhoneDecorator extends Phone{ } static class MediaPlayerPhoneDecorator implements PhoneDecorator { private Phone phone; public MediaPlayerPhoneDecorator() {
} public MediaPlayerPhoneDecorator(Phone phone) {
this.phone = phone;
} public void setPhone(Phone phone) {
this.phone = phone;
} @Override
public int price() {
return 200 + this.phone.price();
} @Override
public void function() {
phone.function();
System.out.println("增强了MP3播放功能");
}
} static class ShotPhoneDecorator implements PhoneDecorator { private Phone phone; public ShotPhoneDecorator(Phone phone) {
this.phone = phone;
} public ShotPhoneDecorator() {
} public void setPhone(Phone phone) {
this.phone = phone;
} @Override
public int price() {
return this.phone.price();
} @Override
public void function() {
phone.function();
System.out.println("增强了拍摄功能");
}
}
}

测试结果:

华为手机的基础功能
1000
华为手机的基础功能
增强了MP3播放功能
1200
华为手机的基础功能
增强了MP3播放功能
增强了拍摄功能
1200
cn.echo42.decorator.Client$MediaPlayerPhoneDecorator@677327b6 Process finished with exit code 0

【Java】【设计模式 Design Pattern】装饰器模式 Decorator的更多相关文章

  1. 设计模式学习心得<装饰器模式 Decorator>

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装 ...

  2. 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...

  3. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  4. 设计模式入门之装饰器模式Decorator

    //装饰模式定义:动态地给一个对象加入一些额外的职责. //就添加功能来说.装饰模式比生成子类更为灵活 //这也提现了面向对象设计中的一条基本原则,即:尽量使用对象组合,而不是对象继承 //Compo ...

  5. Java设计模式——装饰器模式(Decorator)

    今天上课讲了java设计模式中的装饰器模式--Decorator,由于早上起的很早,肚子也很饿,知识点本身也晦涩难懂,听的云里雾里的,所以在课下对这块的知识做出一些总结. 定义 装饰器模式又名包装(W ...

  6. 设计模式(八)装饰器模式Decorator(结构型)

    设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...

  7. 装饰器模式-Decorator(Java实现)

    装饰器模式-Decorator(Java实现) 装饰器模式允许向一个现有的对象添加新的功能, 同时又不改变其结构. 其中 "现有对象"在本文中是StringDisplay类. 添加 ...

  8. 【PHP设计模式 09_ZhuangShiQi.php】装饰器模式 (decorator)

    <?php /** * [装饰器模式 (decorator)] * 有时候发布一篇文章需要经过很多人手,层层处理 */ header("Content-type: text/html; ...

  9. JAVA设计模式之【装饰者模式】

    JAVA设计模式之[装饰者模式] 装饰模式 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用. 在软件设计中,对已有对象(新房)的功能进行扩展(装修). 把通用功能封装在装 ...

  10. 23种设计模式之装饰器模式(Decorator Pattern)

    装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...

随机推荐

  1. zabbix分布式proxy

    1.为什么要学zabbix-proxy https://www.zabbix.com/documentation/4.0/zh/manual/distributed_monitoring/proxie ...

  2. Selenium模块的使用(一)

    简介 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器, 完全模拟浏览器的操作,比 ...

  3. Cannot set properties of undefined (setting 'dataIndex')""

    前端写桑基图的时候碰到以上bug 原因是: 桑基图中的name值有重复的,把重复的name值去掉就好了

  4. 在线Base64转文件、文件转Base64工具

    在线Base64转换神器,一键实现Base64编码与文件互转!支持图片.文档等各类文件,快速准确,安全无服务器存储.拖拽上传,轻松编码解码,提升开发效率.跨平台兼容,移动端友好,让数据转换再无障碍. ...

  5. 【FAQ】HarmonyOS SDK 闭源开放能力 —Asset Store Kit

    1.问题描述 使用关键资产API需要配置SystemCapability.Security.Asset,但不知道syscap.json文件应该配置在哪里,文档也没找到. 解决方案 新增关键资产等API ...

  6. OpenTelemetry 深度定制:跨服务追踪的实战技巧

    背景 在上一篇<从 Dapper 到 OpenTelemetry:分布式追踪的演进之旅>中在最后提到在做一些 Trace 的定制开发. 到现在差不多算是完成了,可以和大家分享一下. 我们的 ...

  7. 全志科技A40i开发板规格书(四核ARM Cortex-A7,主频1.2GHz)

    1.评估板简介 创龙科技TLA40i-EVM是一款基于全志科技A40i处理器设计的4核ARM Cortex-A7高性能低功耗国产评估板,每核主频高达1.2GHz,由核心板和评估底板组成. 评估板接口资 ...

  8. 全志T3+FPGA国产核心板——Pango Design Suite的FPGA程序加载固化

    本文主要基于紫光同创Pango Design Suite(PDS)开发软件,演示FPGA程序的加载.固化,以及程序编译等方法.适用的开发环境为Windows 7/10 64bit. 测试板卡为全志T3 ...

  9. yb课堂 视频详情页模块开发《三十八》

    CourseDetail基础模块开发 CourseDetail模块开发,拆分组件 CourseDetail.vue Header.vue Course.vue Tab.vue Summary.vue ...

  10. Kafka消费端抛出异常Offset commit cannot be completed since the consumer is not part of an active group for auto partition assignment; it is likely that the consumer was kicked out of the group的解决方案

    总结/朱季谦 在一次测试Kafka通过consumer.subscribe()指定偏移量Offset消费过程中,因为设置参数不当,出现了一个异常提示-- [2024-01-04 16:06:32.55 ...