设计模式学习–Decorator
What
Decorator:动态地给一个对象加入一些额外的职责。
就添加功能来说。Decorator模式相比生成子类更加灵活。
Why
Decorator:动态地给一个对象加入一些额外的职责。
就添加功能来说。Decorator模式相比生成子类更加灵活。
Decorator模式适用于能够动态的给对象增删职责。比方qq秀我们能够选择自己形象,并动态的加入衣服以及装饰,让自己的形象感觉高大上起来。Decorator适用于例如以下情况:
1.在不影响其它对象的情况下,以动态、透明的方式给单个对象加入职责。
2.处理那些能够撤销职责的场景。
3.当不能採用子类的方法进行扩充时。
How
如果例如以下场景,近期又个app比較火,FaceQ能够用来创建自己的卡通形象。如果实现这种功能就能够使用Decorator模式。
基础的装扮类
public class Face {
private String name;
public Face(){
}
public Face(String name){
this.name=name;
}
public void show(){
System.out.println("開始装扮Face:" + name);
}
}
脸型装扮类
public class FaceFeature extends Face{
private Face face;
public FaceFeature(){
}
public void decorator(Face face){
this.face=face;
}
@Override
public void show() {
face.show();
}
}
圆型脸
public class RoundFaceFeature extends FaceFeature{
@Override
public void show() {
System.out.println("加入圆脸");
super.show();
}
}
方型脸
public class SquareFaceFeature extends FaceFeature {
@Override
public void show() {
System.out.println("加入方脸");
super.show();
}
}
嘴型装扮类
public class Mouth extends Face {
private Face face;
public Mouth(){
}
public void decorator(Face face){
this.face=face;
}
@Override
public void show() {
face.show();
}
}
微笑嘴型
public class SmileMouth extends Mouth{
@Override
public void show() {
System.out.println("加入微笑");
super.show();
}
}
闭嘴嘴型
public class ClosedMouth extends Mouth {
@Override
public void show() {
System.out.println("加入闭嘴。
");
super.show();
}
}
调用以上装扮类
public static void main(String[] args){
Face face=new Face("test");
RoundFaceFeature roundFaceFeature=new RoundFaceFeature();
SmileMouth smileMouth=new SmileMouth();
roundFaceFeature.decorator(face);
smileMouth.decorator(roundFaceFeature);
smileMouth.show();
}
以上代码的UML图例如以下:

Discuss
在以上演示样例中Face类既充当了职责接口也是详细的装扮对象,FaceFeature以及Mouth为两个装扮类。在java的jdk中也有一个比較典型的Decorator模式使用的地方。在java的io类中,在OutputStream。InputStream,Reader,Writer等都用到了Decorator模式。有时间能够细致分析一下。
设计模式学习–Decorator的更多相关文章
- [学习笔记]设计模式之Decorator
写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 Decorator(装饰)模式,可以动态地给一个对象添加一些额外的职能.为了更好地理解这个模式,我们将时间线拉回Bridge模式笔记的 ...
- Java设计模式学习资源汇总
本文记录了Java设计模式学习书籍.教程资源.此分享会持续更新: 1. 设计模式书籍 在豆瓣上搜索了一把,发现设计模式贯穿了人类生活的方方面面.还是回到Java与程序设计来吧. 打算先归类,再浏览,从 ...
- python之路,Day24 常用设计模式学习
python之路,Day24 常用设计模式学习 本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 ...
- Java设计模式学习记录-GoF设计模式概述
前言 最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过.前段时间看完了JVM的知识,然后就想着JVM那么费劲的东西都看完了,说明自己学 ...
- Java设计模式学习记录-装饰模式
前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一 ...
- swift设计模式学习 - 装饰模式
移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 装饰模式 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真 ...
- 7 种 Javascript 常用设计模式学习笔记
7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...
- 设计模式学习系列6 原型模式(prototype)
原型模式(prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.允许一个对象再创建另外一个新对象的时候根本无需知道任何创建细节,只需要请求圆形对象的copy函数皆可. 1 ...
- Java-马士兵设计模式学习笔记-总结
<马士兵设计模式学习>学习了以下模式: 1.装饰者模式(例子:水管工,木工) 2.策略模式(例子:老师用职称比大小.学生用成绩比大小) 3.简单工厂模式(例子:VechileFactory ...
随机推荐
- python框架之Flask基础篇(四)-------- 其他操作
1.蓝图 要用蓝图管理项目,需要导入的包是:from flask import Buleprint 具体大致分为三步: 1.先在子模块中导入蓝图包,然后再创建蓝图对象. 2.然后将子模块中的视图函数存 ...
- Android studio如何显示代码行数
1.首先打开as:File-->Settings... 2.Editor-->General-->Appearence 3.右边show line numbers 4.依次点击app ...
- css图片特效
网站图片往往有很多显示效果,使用css是实现图片特效的比较简便的方式.下面记录一段css鼠标指向的多重特效: <!DOCTYPE html><html lang="en&q ...
- Angular——内置指令
内置指令 ng-app 指定应用根元素,至少有一个元素指定了此属性. ng-controller 指定控制器 ng-show控制元素是否显示,true显示.false不显示 ng-hide控制元素是否 ...
- c指针之内存释放
// 1.正常使用包含指针的结构体 // 2.正常使用元素类型为指针的vector #include<string.h> #include<stdio.h> #include& ...
- VMware 11安装Mac OS X 10.10 及安装Mac Vmware Tools.
先上一张效果图兴奋一下,博主穷屌丝一个,只能通过虚拟黑苹果体验下高富帅的生活,感觉超爽的,废话不多说的,直接上图了! 目录: 1.安装所需软件下载: 2.Mac OS X10.10 安装基本步骤: 3 ...
- JSP学习笔记 - 内置对象 Request
1.主要掌握以下5个内置对象及其所属类,必须学会在java docs里根据类名查找相应的方法 request javax.servlet.http.HttpServletRequest res ...
- CodeCombat代码全记录(Python学习利器)--Kithgard地牢代码1
Kithgard地牢注意:在调用函数时,要在函数的后面加上括号内容,否则在python中,将不会认为你在调用这个函数内容,而你的英雄将像木头一样站在原地不会执行上左下右的移动!!! hero.move ...
- VMware Workstation搭建Linux操作系统
1.单击“创建新的虚拟机”选项,并在弹出的“新建虚拟机向导”界面中选择“自定义”单选按钮,然后单击“下一步”. 新建虚拟机向导 2.选择虚拟机硬件兼容性,是否兼容之前旧的版本. 兼容性选择 3.选中“ ...
- 使用PHP操作MongoDB数据库
1.连接MongoDB数据库(在已安装php-mongodb扩展的前提下) $config = "mongodb://{$user}:{$pass}@{$host}:{$port}" ...