一.概念
动态的给一个对象添加额外的职责。想要扩展功能的话,装饰者提供了一种有别于继承的另外一种选择。
二.UML
- Component(概念中提到的对象接口),也就是“被装饰者”。
- ConcreateComponent(未添加任何职责的,对象接口的子类)。
- Decorator(装饰者抽象类),扩张了对象接口的功能。
- ConcreteDrcorator(具体装饰类),具体怎么装饰对象接口的在这些类里面反映。
三.实例分析
家里买了一套房子,需要装修,考虑到预算只有这么多,不能采用全包的方式,于是采用将装修工作细化,以节省开销。
House
package com.zzy.decorator;
/**
* 被装修者-房子
* @author eason
*
*/
public interface House {
public void decorate();
}
BlankHouse
package com.zzy.decorator;
/**
* 未经装修的房子
* @author eason
*
*/
public class BlankHouse implements House{
@Override
public void decorate() {
System.out.println("未经装修的房子");
}
}
Decorator
package com.zzy.decorator;
/**
* 装修工抽象类
* @author eason
*
*/
public class Decorator implements House{
private House house;
public Decorator(House house) {
this.house = house;
}
@Override
public void decorate() {
house.decorate();
}
}
ElectricWirer
package com.zzy.decorator;
/**
* 电线工
* @author eason
*
*/
public class ElectricWirer extends Decorator {
public ElectricWirer(House house) {
super(house);
}
@Override
public void decorate() {
super.decorate();
//自己的逻辑-具体怎么包装的写在super.decorate()的前后任何地方
System.out.println("已经装修完电线");
}
}
Floorer
package com.zzy.decorator;
/**
* 地板工
* @author eason
*
*/
public class Floorer extends Decorator {
public Floorer(House house) {
super(house);
}
@Override
public void decorate() {
super.decorate();
//自己的逻辑-具体怎么包装的写在super.decorate()的前后任何地方
System.out.println("已经装修完地板");
}
}
WaterPiper
package com.zzy.decorator;
/**
* 水管工
* @author eason
*
*/
public class WaterPiper extends Decorator {
public WaterPiper(House house) {
super(house);
}
@Override
public void decorate() {
super.decorate();
//自己的逻辑-具体怎么包装的写在super.decorate()的前后任何地方
System.out.println("已经装修完水管");
}
}
TestDecorator
package com.zzy.decorator;
/**
* 测试类
* @author eason
*
*/
public class TestDecorator {
public static void main(String[] args) {
//空白房子一个
House house = new BlankHouse();
//一层层装修
Decorator dec = new Floorer(new ElectricWirer(new WaterPiper(house)));
dec.decorate();
}
}
四.使用场景
- 为已有组件动态添加更多功能。
五.使用感受
- 将装饰功能的代码从Component里面提了出来,简化了Component。
- 客户端可以在运行时根据需要,选择需要的功能来包装Component。
- 继承是扩展功能的方式之一,但并不见得是达到弹性设计的最佳形方式。
- 组合和委托可用于在运行时动态地加上新的行为。装饰者模式实际上就是组合和委托。再次提到组合和委托,第一次提到是在策略模式
里面。
- 在日常的设计中,应该允许行为被扩展,而不需修改现有的代码。
- 装修者会导致设计中出现许多小对象,如果过度使用,会让程序变的复杂。
分享到:
相关推荐
## 开发技术:基于MVC思想和三层设计模式,前台采用bootstrap响应式框架,后台div+css 房屋管理模块,管理员也就是他是管理平台所有的信息。只是负责维护运行租赁网站,不参与直接的租赁业务。 其中管理员的功能...
2、适用人群:计算机,电子信息工程等专业的学习者等, 高分毕业设计项目,也可作为课程设计和期末大作业。本资源仅是代码的压缩包,该代码适合毕业设计、课程设计作业,所有源码均经过严格测试,可以放心下载使用。...
格需求方向繁多、家装销售专业性强,量身定制的设计非常繁复,装修施工价格 差异大,建材的进货退货质量把关复杂,家装需求到验收时间过长,传统的发布 纸质广告与门店等客上门的销售模式已经渐渐落后。此时开发一个...
备注:此系统是源码可以二次开发,主要针对开发人员二次开发学习和参考使用,不懂源码的慎重使用,因时间有限不会安装的联系我,还有需要二开的提前咨询qq:1551924684或者添加微信:WJH20180512 代码来源:吴小朋...
支持线上点播 | 知识付费 | 网校装修 | 数据统计 | 会员模块 | 角色管理等丰富功能。采用前后端分离模式,覆盖 PC | H5 端口。特点:系统稳定 | 功能丰富 | 界面优美 | 持续迭代。截止目前,已超过 1000+ 个人/企业...
2.加盟店的店面装修免费设计 3.对整套业务体系从选址到开业后营运制定标准化和规范化的运营模式,供加盟店经 营使用,提供凝聚茗仁茶业公司成功的营运机制和精华的营运手册及加盟店经营管理手册 茗仁茶业公司总部...
传统家装链条长、细节复杂、参与角色繁多、信息不透明,导致消费者精力耗费大、学习成本高、装修效率和效果难以保障。在传统家装模式下,单个消费者必须直面冗长繁复的建材生产分销、装修服务链条。家装市场的参与方...
当然在社群的装修和设计上,我们全部采用的是自定义化,你可以根据自己的实际需求,把首页装修成一个论坛样式,或者是装修成一个商场样式,或者你直接装修成今日头条样式,甚至有的人会装修成淘宝天猫的首页样式。...
项目介绍 Leadshop是一款提供持续更新迭代服务的免费商城系统,旨在打造极致的用户体验!Leadshop由浙江禾成云计算有限公司研发,...1.允许用于个人学习、毕业设计、教学案例、公益事业; 2.支持企业/个人免费商业使用
电子商务不仅带 动了包括网络基础服务、仓储物流配送、支付渠道、网络营销、网络广告等延伸行业或 互联网其他领域,也由此催生了专职网店卖家、网店装修师、"网模"等一大批新兴职业 。调查显示:目前由电子商务间接...
1、界面直观、友善、操作简单,无需让人讨厌的培训学习,即可上手使用; 2、自带国际级中文报表系统,允许用户自由扩展、随意设计纷繁复杂的报价及项目书样式; 3、提供强大的数据浏览、查询、过滤功能,...
1、框架采用全新thinkphp6+事件开发设计+layui+uniapp进行设计,代码完全重构,采用支持百万级! 2、前端以layui+uniapp模块化开发; 3、数据导出采用phpExcel,使数据更加直观,更方便于管理统计; 4、插件钩子机制...
APP系统结合用户习惯设计,可实现远程控制,便捷度安全性、节能性提升 一键添加房间、情景模式 智能家居互联网+智能平台介绍全文共40页,当前为第5页。 低至1W的灯泡都不出现鬼火 1-2400W功率范围,满足更多设备需求...
该营业厅二楼理财区设有贵宾室、理财室,设计装修高雅、温馨,私密性强,且免费提供书刊、水果、茶水等,是VIP客户的服务、营销平台.自助服务区设有存款机、取款机、多媒体查询机、个人银等自助设备,有效分流了简单交易...
该营业厅二楼理财区设有贵宾室、理 财室,设计装修高雅、温馨,私密性强,且免费提供书刊、水果、茶水等,是VIP客户的 服务、营销平台。自助服务区设有存款机、取款机、多媒体查询机、个人网银等自助设 备,有效分流...