Decrator 装饰模式
注:装饰模式是结构型设计模式,动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
主要是利用组合代替继承来实现业务功能,对动态改变业务实现来说,相比更灵活。
假如我们有一个工程,他有四个展示点,1、2、3、4,外国游客来考察,展示1、2、3比较好,领导来考察,展示2、3、4,下面来观看,展示1、2、4,比较好,这里我们就需要用到装饰模式,利用组合代替继承,动态改变展示效果。
Java代码简单实现
1,工程展示接口
package com.pattern.structure.decrator; public interface Project { public void show() ; }
2, 工程基本展示信息
package com.pattern.structure.decrator; public class ConcreteProject implements Project { @Override public void show() { System.out.println("项目基本情况……"); } }
3,展示装饰抽象类
package com.pattern.structure.decrator; public abstract class Decrator implements Project { private Project project ; public void setProject(Project project ) { this.project = project ; } @Override public void show() { if(project != null) project.show(); } }
4, 1 展示点 装饰类
package com.pattern.structure.decrator; public class One extends Decrator { @Override public void show() { super.show(); addShow(); } private void addShow() { System.out.println("1 展示点展示……"); } }
5, 2 展示点 装饰类
package com.pattern.structure.decrator; public class Two extends Decrator { public void show() { super.show(); addShow(); } private void addShow() { System.out.println("2 展示点展示……"); } }
6, 3 展示点 装饰类
package com.pattern.structure.decrator; public class Three extends Decrator { public void show() { super.show(); addShow(); } private void addShow() { System.out.println("3 展示点展示……"); } }
7, 4 展示点 装饰类
package com.pattern.structure.decrator; public class Four extends Decrator { public void show() { super.show(); addShow(); } private void addShow() { System.out.println("4 展示点展示……"); } }
8, 客户端代码
package com.pattern.structure.decrator; public class Client { public static void main(String[] args) { // 外国考察团,1,2,3 //ConcreteProject project = new ConcreteProject() ; //One one = new One() ; //Two two = new Two() ; //Three three = new Three() ; // //one.setProject(project); //two.setProject(one); //three.setProject(two); // //three.show(); // 领导考察团,2,3,4 //ConcreteProject project = new ConcreteProject() ; //Two two = new Two() ; //Three three = new Three() ; //Four four = new Four() ; // //two.setProject(project); //three.setProject(two); //four.setProject(three); // //four.show(); // 下面干事人员,1,2,4 ConcreteProject project = new ConcreteProject() ; One one = new One() ; Two two = new Two() ; Four four = new Four() ; one.setProject(project); two.setProject(one); four.setProject(two); four.show(); } }
从上面代码可以看出,使用装饰器模式,动态改变展示效果。
装饰模式通用类图
------
文章只为技术交流学习,若所写有误,请斧正,评论或消息与我,为不误导后来学习的人;若有不小心所写侵权,请告知我;若转载,请注明出处。
Decrator 装饰模式的更多相关文章
- (C#)设计模式之装饰模式
1.装饰模式 动态的给一个对象添加一些额外的职责,就添加功能来说,装饰模式比生成子类更加灵活.*装饰模式是为已有功能动态添加更多功能的一种方式.*装饰模式将原有类中的核心职责与装饰功能分离.简化了原有 ...
- 设计模式--装饰模式Decorate(结构型)
一.装饰模式 动态地给一个对象添加额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活.有时我们希望给某个对象而不是整个类添加一些功能. 二.UML图 1.Component(概念中提到的对象接口 ...
- Objective-C 装饰模式--简单介绍和使用
装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 比如游戏机有一个GamePad类, 现在要增加一个作弊功能(例如100 ...
- C#设计模式系列:装饰模式(Decorator)
1. 装饰模式简介 装饰模式动态地给一个对象添加额外的职责.例如一幅画有没有画框都可以挂在墙上,画就是被装饰者.但是通常都是有画框的.在挂在墙上之前,画可以被蒙上玻璃,装到框子里,所以在画上加一层画框 ...
- 装饰模式 - Decorator 和 外观模式 - Facade
装饰模式 Decorator,不改变接口但动态给对象加入责任,所需功能按顺序串联起来控制,比生成子类灵活. 外观模式 Facade,让接口更简单.为子系统中的一组接口提供一个一致的界面. 参考:
- php实现设计模式之 装饰模式
<?php /* * 装饰模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. * * 角色 * 抽象构件(Compone ...
- 设计模式-装饰器模式(Decrator Model)
文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/6057666.html 目录 1.概述 2.目的 3.结构组成 4.实现 5.总结 1.概 ...
- [工作中的设计模式]装饰模式decorator
一.模式解析 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的要点主要是: 1.需要对已有对象扩展新的功能,又不希望改变原有对 ...
- 基于东北F4的设计模式情景剧——第一幕 装饰模式(Decorator Pattern)
第一场 难题未解 布景:铁岭,晴天,午后,风.在一幢还算气派的写字楼的三层外墙上,挂着一条红色横幅,上面用歪歪扭扭的毛笔字写着"东北F4软件外包工作室".大风中,那早已褪色的条幅剧 ...
随机推荐
- Lua字符串及模式匹配
字符类基础函数举例介绍: string.len( ‘string’ ) string.lower( ‘string’ ) string.upper( ‘string’ ) string.rep( ‘a ...
- 用CTime类得到当前日期 时间
(1)定义一个CTime类的对象CTime time: (2)得到当前时间time = CTime::GetCurrentTime(); (3)Get Year(),GetMonth(),GetDay ...
- BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()
这两个宏表示这个类的消息映射开始和结束,中间的宏定义定义了此类的所有的消息映射.前面的afx_msg void OnPaint():只是声明OnPaint()函数的一个消息处理函数,然后是OnPain ...
- Ruby Rails学习中:有点内容的静态页面
续上篇: 一. 有点内容的静态页面 rails new 命令创建了一个布局文件, 不过现在最好不用.我们重命名这个文件: $ mv app/views/layouts/application.html ...
- T100——不绑定数据表字段,做查询条件(待改进)
此例子使用的方法有待改善,不是很好的方法. 范例:aimm200: 作用:查询时默认不显示无效料件:新增参数控制查询是否显示无效料件.(只作用查询,不影响新增.修改等)
- Springboot导出Excel并下载
引入相关依赖 <!--数据导出excel--> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> & ...
- 怎样理解NodeList的动态集合与静态集合
NodeList 有两种, 一种是动态集合, 一种是静态集合, 所谓动态集合, 主要是 Node.prototype.childNodes; 返回的子节点集合对文档的节点增删改会即时改变; 而静态集合 ...
- Java多线程(一):线程与进程
1.线程和进程 1.1 进程 进程是操作系统的概念,我们运行的一个TIM.exe就是一个进程. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位 ...
- List 集合 一行4个排序
List<string> list = new List<string>(); ; i < ; i++) { list.Add(i.ToString()); } int ...
- Ef数据GroupBy多字段查询Vb.net与c#参考
Dim g = lst.Data.GroupBy(Function(T) New With { Key T.mName, Key T.mUnit, Key T.mPrice }).Select(Fun ...