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. Spring Cloud (14) 服务网关-过滤器

    Spring Cloud Zuul作为网关所具备的最基本的功能:路由,还具备另外一个核心的功能:过滤器. 过滤器 通过Spring Cloud Zuul实现的路由功能,我们的微服务可以通过统一的API ...

  2. 线性回归的Cost function实现

    此处使用Octave来实现 线性方程的代价函数: 代价函数: X 是测试值,假设用矩阵表示为         为了方便用矩阵计算我们把X加一列 1 :                 同时  那么h( ...

  3. [Android]异常4-javax.mail.AuthenticationFailedException

    javax.mail.AuthenticationFailedException 背景:JavaMail发送电子邮件 异常原因: 可能一>发件人帐号.密码有误 可能二>需要使用SSL安全认 ...

  4. 文件下载之ServletOutputStream

    使用response.getOutputStream可以获取ServletOutputStream,从而实现向页面发送流数据.但是需要注意的是,不能使用ajax进行请求,因为这样页面不会有任何反应,可 ...

  5. PowerDesigner16逆向工程生成PDM列注释(My Sql5.0模版)

    一.编辑当前DataBase 选择DataBase——>edit Current DBMS...弹出如下对话框:  如上图,先解释一下: 根据红颜色框从上往下解释一下. 第一个红框是对应的修改的 ...

  6. PHP 设计模式--基础

    设计模式的宗旨就是:重用. 在面向对象中,类是用于生成对象的代码模版,而设计模式是用于解决共性问题的代码模版. 遵循这样的模板,我们可以设快速地设计出优秀的代码. 注意,设计模式只是模板,不是具体的代 ...

  7. windows程序设为开机自启动

    在Windows文件管理器中输入 %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup 把程序快捷方式放到此处即可.

  8. 怎么用最短时间高效而踏实地学习Linux?

    在技术行业里,人才的唯一衡量标准就是技术能力,而技术能力,就代表着你的薪资.职位.话语权.很多人都经历过,跟自己同时入行甚至入行还晚的人,成长速度却远超自己,短短两三年就拉开了差距. 秘密就在于,有些 ...

  9. C# MVC ajax上传 文件

    用普通的ajax提交表单的时候,不能把文件流传到后端去,所以要用到jquery.form.js jquery.form.js到官网下载或者从这里下载:http://pan.baidu.com/s/1c ...

  10. openstack——horizon篇

    一.horizon 介绍:       理解 horizon   Horizon 为 Openstack 提供一个 WEB 前端的管理界面 (UI 服务 )通过 Horizone 所提供的 DashB ...