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软件外包工作室".大风中,那早已褪色的条幅剧 ...
随机推荐
- SQuirreL连接Phoenix报java.util.concurrent.TimeoutException
1.表象 java.util.concurrent.TimeoutException at java.util.concurrent.FutureTask.get(FutureTask.java:20 ...
- luoguP2664树上游戏(点分治)
题目链接:https://www.luogu.org/problem/P2664 题意:给定一颗带点权的树,结点数n<=1e5,点权<=1e5,用s(i,j)表示从i到j的路径上不同点权数 ...
- SQL 拼接字符串 使用IN查询方法
问题描述 当在 SQL SERVER 中查询的时候,同事遇到一个字段存储的字符串为用逗号分隔的主键 ID 值,格式为:1,2,3,4,这时候需要查询符合条件的所有数据,所以选择使用 IN 查询,但是直 ...
- 谈谈Java中的集合list、set、map之间的区别
参考文献:https://www.cnblogs.com/IvesHe/p/6108933.html 我这里只总结其区别,具体的说明,请查看参考文献,讲的很详细. A.list接口,实现子类有:arr ...
- ArrayList与LinkedList的区别,如何减少嵌套循环的使用
如果要减少嵌套循环的使用: 我们可以将需要在二重循环里面判断的条件放在一个Map的key里面: 在判断的时候只需要进行key是否存在,然后操作接下来的步骤: 这样子就会减少二重循环了,不会发生循环n* ...
- PAT B1041 考试座位号(15)
解题要点: 使用结构体保存准考证号,考试座位号 试机座位号作考生数组下标 通过试机座位号获取考生号,座位号 考生号使用long long存放 //课本AC代码 #include <cstdio& ...
- 后缀数组练习2:可重叠的k次最长重复子串
其实和上一题是差不多的,只是在二分check的时候有一些小小的改动 1468: 后缀数组2:可重叠的k次最长重复子串 poj3261 时间限制: 1 Sec 内存限制: 128 MB提交: 113 ...
- Django项目中添加富文本编辑器django-ckeditor
django-ckeditor库的使用步骤: 1.在命令行下安装django-ckeditor这个库: 命令:pip install django-ckeditor 2.安装成功后,配置Django项 ...
- tensorflow零起点快速入门(2)
指定设备与矩阵乘法 使用tf.device("/gpu:0")用于指定设备进行运算. 在使用jupyter notebook的时候,可能会出现使用异常,需要使用config=tf. ...
- 服务端相关知识学习(二)之Zookeeper可以干什么
Zookeeper主要可以干哪些事情 配置管理,名字服务,提供分布式同步以及集群管理.那这些服务又到底是什么呢?我们为什么需要这样的服务?我们又为什么要使用Zookeeper来实现呢,使用Zookee ...