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. ACM_填格子

    填格子 Time Limit: 2000/1000ms (Java/Others) Problem Description: 在一个n*n格子里边已经填了部分大写字母,现在给你个任务:把剩下的格子也填 ...

  2. RecyclerView中item无法充满的问题

    首先致谢:https://blog.csdn.net/yuanlvmao/article/details/51694211 咱们不是代码的生产者,只是代码的搬运工. 今天写了一个RecyclerVie ...

  3. JS高级——instanceof语法

    基本语法 对象 instanceof 构造函数 基本使用 <script> function Person() { } //p--->Person.prototype--->O ...

  4. 移动web——媒体查询

    基本概念 响应式开发在没有媒体查询前,也可以通过js来实现,但是人们基本不会考虑,特别繁琐.在出现了媒体查询,才开始逐渐推广响应式.实际开发中,在时间与金钱充足的情况下还是别做响应式,影响性能,维护麻 ...

  5. Windows2008 Server 常规设置及基本安全策略

    一.系统及程序 1.屏幕保护与电源 桌面右键--〉个性化--〉屏幕保护程序屏幕保护程序 选择无更改电源设置 选择高性能选择关闭显示器的时间 关闭显示器 选 从不 保存修改 2.安装IIS 管理工具-- ...

  6. 浅谈SOCKS5代理与HTTP代理的应用区别

    [1]什么是SOCKS5协议. SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递.SOCKS是"Sockets”的缩写. 当防火墙后的客户端要访问外部的服务器时,就 ...

  7. centOS Linux下用yum安装mysql

    centOS Linux下用yum安装mysql      第一篇:安装和配置MySQL   第一步:安装MySQL   [root@192 local]# yum -y install mysql- ...

  8. 【转载】resolv.conf中search作用

    原文地址:http://www.oliver.ren/linux/387.html reslov.conf中的search主要是用来补全hostname的,有时候域名太长,可以做一个短域名做主机名字, ...

  9. POJ 2823 Sliding Window & Luogu P1886 滑动窗口

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 66613   Accepted: 18914 ...

  10. B树、B+树

    when ? why ? how ? what ? 平衡二叉树其查找的时间复杂度是 O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率. 如果我们要操作的数据集非常大,大到内存已经没法 ...