注:装饰模式是结构型设计模式,动态地给一个对象增加一些额外的职责,就增加的功能来说,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 装饰模式的更多相关文章

  1. (C#)设计模式之装饰模式

    1.装饰模式 动态的给一个对象添加一些额外的职责,就添加功能来说,装饰模式比生成子类更加灵活.*装饰模式是为已有功能动态添加更多功能的一种方式.*装饰模式将原有类中的核心职责与装饰功能分离.简化了原有 ...

  2. 设计模式--装饰模式Decorate(结构型)

    一.装饰模式 动态地给一个对象添加额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活.有时我们希望给某个对象而不是整个类添加一些功能. 二.UML图 1.Component(概念中提到的对象接口 ...

  3. Objective-C 装饰模式--简单介绍和使用

    装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 比如游戏机有一个GamePad类, 现在要增加一个作弊功能(例如100 ...

  4. C#设计模式系列:装饰模式(Decorator)

    1. 装饰模式简介 装饰模式动态地给一个对象添加额外的职责.例如一幅画有没有画框都可以挂在墙上,画就是被装饰者.但是通常都是有画框的.在挂在墙上之前,画可以被蒙上玻璃,装到框子里,所以在画上加一层画框 ...

  5. 装饰模式 - Decorator 和 外观模式 - Facade

    装饰模式 Decorator,不改变接口但动态给对象加入责任,所需功能按顺序串联起来控制,比生成子类灵活. 外观模式 Facade,让接口更简单.为子系统中的一组接口提供一个一致的界面. 参考:

  6. php实现设计模式之 装饰模式

    <?php /* * 装饰模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. * * 角色 * 抽象构件(Compone ...

  7. 设计模式-装饰器模式(Decrator Model)

    文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/6057666.html 目录 1.概述 2.目的 3.结构组成 4.实现 5.总结 1.概 ...

  8. [工作中的设计模式]装饰模式decorator

    一.模式解析 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的要点主要是: 1.需要对已有对象扩展新的功能,又不希望改变原有对 ...

  9. 基于东北F4的设计模式情景剧——第一幕 装饰模式(Decorator Pattern)

    第一场 难题未解 布景:铁岭,晴天,午后,风.在一幢还算气派的写字楼的三层外墙上,挂着一条红色横幅,上面用歪歪扭扭的毛笔字写着"东北F4软件外包工作室".大风中,那早已褪色的条幅剧 ...

随机推荐

  1. git stash save -a 遇到的坑 , 弹出匿藏错误

    情景一: 用命令行的 : git stash save -u "描述" git stash save -a "描述" -u: 会把没有记录到的文件也保存下来(比 ...

  2. Linux文件权限基础回顾介绍

    文件的权限 文件权限的概述: 权限贯穿运维的一生

  3. luoguP2634聪聪可可(点分治)

    题目链接:https://www.luogu.org/problem/P2634 题意:给一颗树,求距离的模3为0的点对数量,注意(1,1)算一个点对,(1,2)和(2,1)算两个点对. 思路:和点分 ...

  4. svn服务器端的更新操作

    svn up需要在 非svn库中进行操作 ,一般在网站www目录下操作

  5. centos7安装oracle1201c

    root身份安装依赖包: yum -y install binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33*.i686 el ...

  6. Oracle如何创建索引、删除索引、查询索引

    1.创建单一索引 create index 索引名称 on 表名(列名); 2.创建复合索引 create index 索引名称 on 表名(列名1,列名2); 3.删除索引 drop index 索 ...

  7. SqlServer判断表中某列是否包含中文,英文,纯数字

    原文:SqlServer判断表中某列是否包含中文,英文,纯数字 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog ...

  8. SQLServer启动和关闭bat脚本

    原文:SQLServer启动和关闭bat脚本   安装完毕SQL SERVER 2005后,会默认自动启动SQL Server等几个服务,这几个服务比较占用系统资源.当不运行SQL Server时,最 ...

  9. Asp.net core Enum as string + ef core value convertor

    更新 : 2019-06-08 build in convertor https://docs.microsoft.com/en-us/ef/core/modeling/value-conversio ...

  10. 怎样查看或修改html的绝对路径

    查看用 Node.prototype.baseURI, 修改用 <base>; document.baseURI; // https://www.cnblogs.com/aisowe // ...