What

Decorator:动态地给一个对象加入一些额外的职责。

就添加功能来说。Decorator模式相比生成子类更加灵活。

Why

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的更多相关文章

  1. [学习笔记]设计模式之Decorator

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 Decorator(装饰)模式,可以动态地给一个对象添加一些额外的职能.为了更好地理解这个模式,我们将时间线拉回Bridge模式笔记的 ...

  2. Java设计模式学习资源汇总

    本文记录了Java设计模式学习书籍.教程资源.此分享会持续更新: 1. 设计模式书籍 在豆瓣上搜索了一把,发现设计模式贯穿了人类生活的方方面面.还是回到Java与程序设计来吧. 打算先归类,再浏览,从 ...

  3. python之路,Day24 常用设计模式学习

    python之路,Day24 常用设计模式学习   本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 ...

  4. Java设计模式学习记录-GoF设计模式概述

    前言 最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过.前段时间看完了JVM的知识,然后就想着JVM那么费劲的东西都看完了,说明自己学 ...

  5. Java设计模式学习记录-装饰模式

    前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一 ...

  6. swift设计模式学习 - 装饰模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 装饰模式 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真 ...

  7. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  8. 设计模式学习系列6 原型模式(prototype)

    原型模式(prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.允许一个对象再创建另外一个新对象的时候根本无需知道任何创建细节,只需要请求圆形对象的copy函数皆可. 1 ...

  9. Java-马士兵设计模式学习笔记-总结

    <马士兵设计模式学习>学习了以下模式: 1.装饰者模式(例子:水管工,木工) 2.策略模式(例子:老师用职称比大小.学生用成绩比大小) 3.简单工厂模式(例子:VechileFactory ...

随机推荐

  1. Centos7下安装python环境

    前言 centos7默认是装有pyhton的. #检查python版本 [root@oldboy_python ~ ::]#python -V Python 但是众所周知,python2版本到2020 ...

  2. python--8、面向对象的深入知识

    面向对象的三大特性 上一篇我们讲的主要内容都符合面向对象的封装特性.那么问题来了?面向对象难道只有封装性么?当然不是,作为一个这么难理解的东西,要是只有封装性都对不起我们死了这么多脑细胞!所以,晴天霹 ...

  3. android Activity实现底部滑动弹出窗口及源码下载地址

    在做微信.微博.qq等分享时,一般是点击分享按钮后会从底部弹出滑动窗口,然后选择要分享的社交平台进行分享.今日头条.腾讯新闻等内容App的评论也是从底部滑动弹出输入窗口,进行评论输入的.本篇文章就讲讲 ...

  4. 如何修改wampserver中mysql中字符编码的解决方案

    因为我用的一般都是utf8,所以有必要改一下: 打开mysql控制台,输入密码登录之后,执行命令: show variables like ‘%char%’; 注意引号的中英文格式以及最后面的分号不要 ...

  5. 影响ERP成功实施的因素及实施方法

    一.影响ERP实施的因素 1.企业自身管理和认识上的问题.在ERP实施过程中没有用变革管理的理念和方法来策划和管理ERP的实施是导致ERP失败的主要原因. ERP作为一种管理工具他的实施本身就是操作手 ...

  6. 解决Sql Server 日志满了,设置收缩

    解决Sql Server 日志满了,设置收缩: --查看文件占用空间 . '文件大小(MB)',* from sysfiles; ALTER DATABASE SpyData SET RECOVERY ...

  7. MSSQL高并发下生成连续不重复的订单号

    一.确定需求 只要做过开发的基本上都有做过订单,只要做过订单的基本上都要涉及生成订单号,可能项目订单号生成规则都不一样,但是大多数规则都是连续增长. 所以假如给你一个这样的需求,在高并发下,以天为单位 ...

  8. Centos6.6 安装rsync服务端

    一.介绍 在工作中经常遇到代码分发,或者是资料备份,都会用到rsync,配置不算复杂,仅做下记录,安装环境如下: 1) Centos6.6 2) rsync-3.0.6-12.el6.x86_64 3 ...

  9. R包

    查看默认安装包的位置 .libPaths() 移除包 remove.packages("package_name") 查看所有安装的包 library() 按 q 退出包列表   ...

  10. 彩色MT9V034摄像头 Bayer转rgb FPGA实现

    1 图像bayer格式介绍 bayer格式是伊士曼·柯达公司科学家Bryce Bayer发明的,Bryce Bayer所发明的拜耳阵列被广泛运用数字图像.Bayer格式是相机内部的原始数据, 一般后缀 ...