【Java】【设计模式 Design Pattern】装饰器模式 Decorator
解决的问题:
对象的扩展问题:
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的更多相关文章
- 设计模式学习心得<装饰器模式 Decorator>
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装 ...
- 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...
- Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- 设计模式入门之装饰器模式Decorator
//装饰模式定义:动态地给一个对象加入一些额外的职责. //就添加功能来说.装饰模式比生成子类更为灵活 //这也提现了面向对象设计中的一条基本原则,即:尽量使用对象组合,而不是对象继承 //Compo ...
- Java设计模式——装饰器模式(Decorator)
今天上课讲了java设计模式中的装饰器模式--Decorator,由于早上起的很早,肚子也很饿,知识点本身也晦涩难懂,听的云里雾里的,所以在课下对这块的知识做出一些总结. 定义 装饰器模式又名包装(W ...
- 设计模式(八)装饰器模式Decorator(结构型)
设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...
- 装饰器模式-Decorator(Java实现)
装饰器模式-Decorator(Java实现) 装饰器模式允许向一个现有的对象添加新的功能, 同时又不改变其结构. 其中 "现有对象"在本文中是StringDisplay类. 添加 ...
- 【PHP设计模式 09_ZhuangShiQi.php】装饰器模式 (decorator)
<?php /** * [装饰器模式 (decorator)] * 有时候发布一篇文章需要经过很多人手,层层处理 */ header("Content-type: text/html; ...
- JAVA设计模式之【装饰者模式】
JAVA设计模式之[装饰者模式] 装饰模式 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用. 在软件设计中,对已有对象(新房)的功能进行扩展(装修). 把通用功能封装在装 ...
- 23种设计模式之装饰器模式(Decorator Pattern)
装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...
随机推荐
- zabbix分布式proxy
1.为什么要学zabbix-proxy https://www.zabbix.com/documentation/4.0/zh/manual/distributed_monitoring/proxie ...
- Selenium模块的使用(一)
简介 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器, 完全模拟浏览器的操作,比 ...
- Cannot set properties of undefined (setting 'dataIndex')""
前端写桑基图的时候碰到以上bug 原因是: 桑基图中的name值有重复的,把重复的name值去掉就好了
- 在线Base64转文件、文件转Base64工具
在线Base64转换神器,一键实现Base64编码与文件互转!支持图片.文档等各类文件,快速准确,安全无服务器存储.拖拽上传,轻松编码解码,提升开发效率.跨平台兼容,移动端友好,让数据转换再无障碍. ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Asset Store Kit
1.问题描述 使用关键资产API需要配置SystemCapability.Security.Asset,但不知道syscap.json文件应该配置在哪里,文档也没找到. 解决方案 新增关键资产等API ...
- OpenTelemetry 深度定制:跨服务追踪的实战技巧
背景 在上一篇<从 Dapper 到 OpenTelemetry:分布式追踪的演进之旅>中在最后提到在做一些 Trace 的定制开发. 到现在差不多算是完成了,可以和大家分享一下. 我们的 ...
- 全志科技A40i开发板规格书(四核ARM Cortex-A7,主频1.2GHz)
1.评估板简介 创龙科技TLA40i-EVM是一款基于全志科技A40i处理器设计的4核ARM Cortex-A7高性能低功耗国产评估板,每核主频高达1.2GHz,由核心板和评估底板组成. 评估板接口资 ...
- 全志T3+FPGA国产核心板——Pango Design Suite的FPGA程序加载固化
本文主要基于紫光同创Pango Design Suite(PDS)开发软件,演示FPGA程序的加载.固化,以及程序编译等方法.适用的开发环境为Windows 7/10 64bit. 测试板卡为全志T3 ...
- yb课堂 视频详情页模块开发《三十八》
CourseDetail基础模块开发 CourseDetail模块开发,拆分组件 CourseDetail.vue Header.vue Course.vue Tab.vue Summary.vue ...
- 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 ...