装饰模式
2016-04-11 16:37
239 查看
装饰模式:顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例
装饰模式使用被装饰类的一个子类的实例,把客户端的调用委派到被装饰类,装饰模式的关键在于这种扩展是完全透明的。
项目经理A 在做需求分析
项目经理A 在做架构设计
项目经理A 在做详细设计
代码工人 在编写代码,加班编啊编啊,终于编完了!
项目经理B 在做需求分析
项目经理B 在做详细设计
代码工人 在编写代码,加班编啊编啊,终于编完了!
项目经理B 在做收尾工作
装饰模式使用被装饰类的一个子类的实例,把客户端的调用委派到被装饰类,装饰模式的关键在于这种扩展是完全透明的。
//装饰模式 /** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-3 12:51:06 * 项目 */ interface Project { /** * 写代码 */ void doCoding(); } /** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-3 12:52:12 * 代码工人 */ class Employe implements Project{ /** * 编码 */ public void doCoding(){ System.out.println("代码工人 在编写代码,加班编啊编啊,终于编完了!"); } } /** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-3 12:51:26 * 项目经理 */ class Manager implements Project { private Project project; //实际上存放的是代码工人对象 public Manager(Project project) { this.project = project; } /** * 编码 */ public void doCoding() { //项目经理开始新的工作 startNewWork(); } /** * 模板:定义项目经理自己的事情 */ public void startNewWork() { //项目经理在做早期工作 doEarlyWork(); //项目经理很牛,做完需求和设计后,直接将编码委派给代码工人干 project.doCoding(); //项目经理在做收尾工作 doEndWork(); } /** * 项目经理自己的事情:做早期工作 */ public void doEarlyWork() { } /** * 项目经理做收尾工作 */ public void doEndWork() { } } /** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-3 13:45:18 * 具体的项目经理A */ class ManagerA extends Manager{ public ManagerA(Project project) { super(project); } /** * 项目经理自己的事情:做早期工作 */ public void doEarlyWork() { System.out.println("项目经理A 在做需求分析"); System.out.println("项目经理A 在做架构设计"); System.out.println("项目经理A 在做详细设计"); } } /** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-3 13:45:27 * 具体的项目经理B */ class ManagerB extends Manager { public ManagerB(Project project) { super(project); } /** * 项目经理自己的事情:做早期工作 */ public void doEarlyWork() { System.out.println("项目经理B 在做需求分析"); System.out.println("项目经理B 在做详细设计"); } /** * 项目经理做收尾工作 */ public void doEndWork() { System.out.println("项目经理B 在做收尾工作"); } } /** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-3 13:03:22 * 客户端测试 */ public class Client { public static void main(String args[]) { Project employe = new Employe(); //代码工人 Project managerA = new ManagerA(employe); //项目经理 Project managerB = new ManagerB(employe); //项目经理 //以经理的名义将编码完成,功劳都是经理的,实际编码的是工人 managerA.doCoding(); managerB.doCoding(); } }运行结果:
项目经理A 在做需求分析
项目经理A 在做架构设计
项目经理A 在做详细设计
代码工人 在编写代码,加班编啊编啊,终于编完了!
项目经理B 在做需求分析
项目经理B 在做详细设计
代码工人 在编写代码,加班编啊编啊,终于编完了!
项目经理B 在做收尾工作
相关文章推荐
- java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决方式
- 基于centos搭建nginx+uwsgi运行django环境
- 云栖神侠传—阿里云数据库专家德歌告诉你PostgreSQL的那些事
- 构建之法阅读笔记03
- apache httpd-2.4.18 安装教程
- poj 1192(简单树形dp)
- MFC DestroyWindow窗口对象和窗口句柄的销毁
- Android多媒体之照相机
- SQL GUID去除横线,并转换为小写
- 感觉Idea用起来比eclipse舒服
- CSS兼容性问题汇总
- OpenGL基础图形编程(八)变换
- qt中文乱码问题(1)
- mysql触发器
- ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步
- jboss eap 6.4 部署 从weblogic迁移
- 安卓开发规范参考
- Java 如何有效地避免OOM:善于利用软引用和弱引用
- STM32 ADC—DMA传输
- Android中的dialog窗口