GoF--装饰者设计模式
顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
装饰器模式的应用场景:
1、需要扩展一个类的功能。
2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
缺点:产生过多相似的对象,不易排错!


package edu.gof.decorator; //抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
public interface Project { // 编写代码
void doCoding();
}
Class : Employe
package edu.gof.decorator; //具体构件角色(Employe):定义一个将要接收附加责任的类
public class Employe implements Project { // 真正的编码工作
public void doCoding() {
System.out.println("码农:佛祖保佑,没有BUG");
} }
Class : Manager
package edu.gof.decorator; //装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
public class Manager implements Project { // 实际上存放的是代码工人对象
private Project project; public Manager() {
super();
} public Manager(Project project) {
super();
this.project = project;
} // 编码,总揽大局。装饰编码过程。
public void doCoding() {
// 项目经理开始新的项目
this.startNewWork();
} // 模板:定义项目经理自己的事情
public void startNewWork() {
// 项目经理在做早期工作
this.doEarlyWork();
// 早期工作完成,交由码农开始真正的编码工作
this.project.doCoding();
// 项目经理在做收尾工作
this.doEndWork();
} // 项目经理的早期工作
public void doEndWork() { } // 项目经理的收尾工作
public void doEarlyWork() { } }
Class : ManagerA
package edu.gof.decorator;
public class ManagerA extends Manager {
public ManagerA() {
super();
}
public ManagerA(Project project) {
super(project);
}
public void doEarlyWork(){
System.out.println("项目经理A 在做需求分析");
System.out.println("项目经理A 在做架构设计");
System.out.println("项目经理A 在做详细设计");
}
}
Class : ManagerB
package edu.gof.decorator;
public class ManagerB extends Manager {
public ManagerB() {
super();
}
public ManagerB(Project project) {
super(project);
}
public void doEarlyWork(){
System.out.println("项目经理B 在做需求分析");
System.out.println("项目经理B 在做架构设计");
}
public void doEndWork(){
System.out.println("项目经理B 在做收尾工作");
}
}
Class : DecoratorTest
package edu.gof.decorator;
public class DecoratorTest {
public static void main(String[] args){
Project ManagerA = new ManagerA(new Employe());
ManagerA.doCoding();
System.out.println("------------------------");
Project ManagerB = new ManagerB(new Employe());
ManagerB.doCoding();
}
}
Console :
项目经理A 在做需求分析
项目经理A 在做架构设计
项目经理A 在做详细设计
码农:佛祖保佑,没有BUG
------------------------
项目经理B 在做需求分析
项目经理B 在做架构设计
码农:佛祖保佑,没有BUG
项目经理B 在做收尾工作
啦啦啦
GoF--装饰者设计模式的更多相关文章
- (java)从零开始之--装饰者设计模式
装饰者设计模式:简单定义:增强一个类的功能,而且还可以让这些装饰类互相装饰. 应用场景:当要在某个功能的基础上扩充功能,并且扩充的功能具有大量排列组合,通过继承关系会衍生出大量子类,这时候用装饰者模式 ...
- 用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题
post的乱码问题比较好解决,这里主要是对get请求的乱码做处理 解决思路:增强request对象的getParameter方法,使之 getParameter 直接获取到的就是解决乱码后的数据 有 ...
- 设计模式--装饰者设计模式(Decorator)
装饰者模式又叫包装模式. 通过另一个对象来扩展自己的行为,在不破坏类的封装的情况下,实现松耦合,易扩展的效果. 抽象组件角色: 一个抽象接口,是被装饰类和装饰类的父接口可以给这些对象动态地添加职责 ...
- 42、Java装饰者设计模式
设计模式简介 什么是设计模式?设计模式是可以重复利用的解决方案.软件开发的先驱或者前辈们将之前在开发中遇到的问题进行总结并给出了解决方案,后辈在遇到这些问题之后直接使用这些方案即可解决问题.比如盖高楼 ...
- 装饰器设计模式初探及Java中实际应用举例
本篇随笔主要介绍用Java实现简单的装饰器设计模式: 先来看一下装饰器设计模式的类图: 从图中可以看到,我们可以装饰Component接口的任何实现类,而这些实现类也包括了装饰器本身,装饰器本身也可 ...
- GOF 23种设计模式目录
经典的gof 23种设计模式,目录大纲查看. 1. Singleton(单例模式) 保证一个类只有一个实例,并提供访问它的全局访问点. 2. Abstract Factory(抽象工厂模式) 提供一个 ...
- 11 IO流(八)——装饰器设计模式,Filter装饰流
声明:本文部分图片及内容引用自:https://www.cnblogs.com/qiumingcheng/p/5219631.html java装饰器设计模式 举一个形象的例子,人可以说话,而扩音器可 ...
- Day 17:缓冲输出字符流和用缓冲输入输出实现登录、装饰者设计模式
输出字符流 Writer 所有输出字符流的基类, 抽象类. FileWriter 向文件输出字符数据的输出字符流. BufferedWriter 缓冲输出字符流 缓冲输出字符流作用: ...
- GOF 23种设计模式
设计模式目录 创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Builder(建造者) 4. Prototype(原型) 5. Sin ...
- GoF 23种设计模式概述
本文的结构: 一.设计模式总览 二.创建型设计模式 Creational Patterns 三.结构型设计模式 Structural Patterns 四.行为型设计模式 Behavioral Pat ...
随机推荐
- 【oneday_onepage】——Microsoft to acquire Nokia's mobile phone business
Nokia will focus on network infrastructure, mapping and locations services and technology developmen ...
- git基本操作:上传代码
利用git将本地代码提交到远程服务器一般分为如下5个步骤: 一.查看当前文件的状态 使用git status命令可以查看有那些文件进行了修改,一般有下面几个状态: 1.Untracked: 未跟踪, ...
- 唯一id算法
https://blog.csdn.net/guodongcc322/article/details/55211273 https://blog.csdn.net/weixin_36751895/ar ...
- 【转】MYSQL数据库四种索引类型的简单使用--MYSQL组合索引“最左前缀”原则
MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 ...
- C#往SQLServer中插入大数据
以前插入大数据的时候都是一条一条的插入,由于电脑配置不行,有一次17万条数据用了半个小时才插入完成,那个蛋疼啊! 前面听杨中科老师的课,发现一个很好的东西,25万条数据配置好的电脑几秒钟就完成了,那是 ...
- NetBeans IDE集成Maven
NetBeans6.7更新版本已经内置对Maven支持.如遇以前的版本,Maven插件在插件管理器中可用.我们正在使用NetBeans在这个例子中使用6.9. 在NetBeans一些特点如下 您可以从 ...
- POJ 3126 --Father Christmas flymouse【scc缩点构图 && SPFA求最长路】
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 3007 Accep ...
- 文字超过字符长度 显示… 点点点 jquery
在 script脚本区域里面定义如下方法 jQuery.fn.limit = function() { var self = $("[limit]"); self.each(fun ...
- Intellij修改模板代码
比如class的注释之类的,直接地址为 其中Include才是真正的内容
- thinkphp中的类库与引用import引入机制
ThinkPHP的类库包括基类库和应用类库 控制器类 模块名+Action 例如 UserAction.InfoAction 模型类 模型名+Model 例如 UserModel.InfoModel ...