装饰者模式针对的问题是:对一个结构已经确定的类,在不改变该类的结构的情况下,动态增加一些功能。

  一般来说,都是对一些已经写好的架构增加自己的功能,或者应对多种情况,增加功能。

  我们还是来玩一句红警,首先我们进入游戏,这时我们只有一个基地车,右边的界面有个黑色的框,什么操作也没有。

  这里,我们假定有个操作的接口Operation

public interface Operation {
//操作
public void doOperation();
}

  我们自己,叫做一个MyOperation,实现我们的操作接口,说明我们是可以有操作的,但现在很迷茫,不知道干啥。

public class MyOperation implements Operation{

    @Override
public void doOperation() {
// TODO Auto-generated method stub
System.out.println("该干点啥");
}
}

  玩过红警的都知道,当然,没玩过的我现在告诉你,红警第一步,让基地车打坐,这样我们才会多出一些功能,才有更多的操作去做。

  但是,我们的MyOperation是已经写好了的,不能游戏每次有进展,都重新去改一遍代码,但是为了增加功能,于是程序员就想到了一个叫做装饰者的模式来实现这个功能。

  先搭建一个装饰者的抽象类,其他装饰者继承这个抽象类就可以了。

  装饰者 持有一个被装饰的对象,都是操作,所以他们都实现Operation接口,并且增加了一个消耗金币的函数

public abstract class DecoratorOperation implements Operation{
public Operation operation; public DecoratorOperation(Operation operation){
this.operation=operation;
} @Override
public void doOperation() {
// TODO Auto-generated method stub
operation.doOperation();
}
protected void consume(){ }
}

  随着游戏进程,我么多了一个兵营,有一个造美国大兵的操作了。所以聪明的程序员想到了加入一个装饰者,增加这个功能。

public class SoldierOperation extends DecoratorOperation{

    public SoldierOperation(Operation operation){
super(operation);
}
@Override
public void doOperation() {
// TODO Auto-generated method stub
operation.doOperation();
makePanzer();
}
public void makePanzer(){
System.out.println("开始制造美国大兵");
}
@Override
protected void consume() {
// TODO Auto-generated method stub
System.out.println("花费了50金");
}
}

  美国大兵站站底盘挖挖矿,又多了个战车的功能

  

public class PanzerOperation extends DecoratorOperation{

    public PanzerOperation(Operation operation){
super(operation);
}
@Override
public void doOperation() {
// TODO Auto-generated method stub
operation.doOperation();
makePanzer();
}
public void makePanzer(){
System.out.println("开始制造坦克");
}
@Override
protected void consume() {
// TODO Auto-generated method stub
System.out.println("花费了100金");
}
}

  现在可以试试了,本来迷茫度日的基地有事干了

public class RedAlert {
public static void main(String[] args) {
MyOperation me=new MyOperation();
me.doOperation();
PanzerOperation panzer=new PanzerOperation(me);
panzer.doOperation();
SoldierOperation soldier=new SoldierOperation(me);
soldier.doOperation();
}
}

  

  甚至说,我们的操作还可以合二为一,一起做(装饰者也是Operation 的实现类)

public class RedAlert {
public static void main(String[] args) {
MyOperation me=new MyOperation();
me.doOperation();
PanzerOperation panzer=new PanzerOperation(me);
panzer.doOperation();
SoldierOperation soldier=new SoldierOperation(panzer);
soldier.doOperation();
}
}

  

  思考与总结:

  1.Decorator装饰者模式,添加功能用,一般在加入的新功能在特定的环境下用时,不便修改原来的代码。

  2.可以分开核心功能和装饰的新功能,在不同场景用不同的装饰,而且可以有选择有顺序的包装。

  

  

设计模式(三)装饰者模式Decorator的更多相关文章

  1. 设计模式学习--装饰者模式(Decorator Pattern)

    概念: 装饰者模式(Decorator Pattern): 动态地将功能添加到对象,相比生成子类更灵活,更富有弹性. 解决方案: 装饰者模式的重点是对象的类型,装饰者对象必须有着相同的接口,也也就是有 ...

  2. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  3. 23种设计模式之装饰器模式(Decorator Pattern)

    装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...

  4. [设计模式] 9 装饰者模式 Decorator

    转:http://www.jellythink.com/archives/171#prettyPhoto 什么是装饰模式? 在GOF的<设计模式:可复用面向对象软件的基础>一书中对装饰模式 ...

  5. C#设计模式之装饰者模式(Decorator Pattern)

    1.概述 装饰者模式,英文名叫做Decorator Pattern.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 2 ...

  6. c#设计模式之装饰器模式(Decorator Pattern)

    引子 在面向对象语言中,我们常常会听到这样一句话:组合优于继承.那么该如何去理解这句话呢? 下面我将以游戏装备为模型用简单的代码去展示它 先创建一个装备的抽象类,然后创建刀枪2个具体的业务子类 pub ...

  7. 【UE4 设计模式】装饰器模式 Decorator Pattern

    概述 描述 动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活.是一种对象结构型模式. 套路 抽象构件(Component) 具体构 ...

  8. C#设计模式(9)——装饰者模式(Decorator Pattern)

    一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...

  9. 设计模式:装饰器(Decorator)模式

    设计模式:装饰器(Decorator)模式 一.前言    装饰器模式也是一种非常重要的模式,在Java以及程序设计中占据着重要的地位.比如Java的数据流处理,我们可能看到数据流经过不同的类的包装和 ...

  10. 浅谈设计模式--装饰者模式(Decorator Pattern)

    挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...

随机推荐

  1. MongoDB学习笔记&lt;一&gt;

    今天学习了shell的主要的操作,例如以下: 1.创建一个数据库foobar use foobar 2.给指定的数据库加入集合,并加入记录 db.person.insert({"name&q ...

  2. C语言可变參函数的实现

    1 C语言中函数调用的原理 函数是大多数编程语言都实现的编程要素.调用函数的实现原理就是:运行跳转+參数传递.对于运行跳转,全部的CPU都直接提供跳转指令:对于參数传递,CPU会提供多种方式.最常见的 ...

  3. Winform开发框架中工作流模块的表设计分析

    在较早博客随笔里面写过文章<Winform开发框架之简易工作流设计>之后,很久没有对工作流部分进行详细的介绍了,本篇继续这个主题,详细介绍其中的设计.实现及效果给大家,这个工作流在好几年前 ...

  4. 企业级PPTP服务器

    第一个里程碑:检查系统是否支持ppp [root@m01 ~]# cat /dev/ppp cat: /dev/ppp: No such device or address 如果出现以上提示则说明pp ...

  5. springboot学习笔记-4 整合Druid数据源和使用@Cache简化redis配置

    一.整合Druid数据源 Druid是一个关系型数据库连接池,是阿里巴巴的一个开源项目,Druid在监控,可扩展性,稳定性和性能方面具有比较明显的优势.通过Druid提供的监控功能,可以实时观察数据库 ...

  6. rwx读写执行对文件和目录的意义

    文件 目录 r 查看 列出目录内容 w 修改 在目录内新建删除文件 x 执行 可以进入目录 对文件的删除权限是对文件所有目录的写权限 对目录-wx的权限,有写和执行权限,既可以在目录内创建删除文件,可 ...

  7. Mac和Xcode常用的快捷键

    Mac电脑一般都不怎么用鼠标,因此除了触摸屏的各种双指.三指甚至四指的操作之外,快捷键的使用可以带来非常大的便利,本文则主要收集整理了自己在Mac常规和Xcode开发过程中常用的一些快捷键. 一.Ma ...

  8. java随机生成验证码

    package com.yuyuchen.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; im ...

  9. 为什么CPU需要时钟这种概念?

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/132 最近在研究计算机里的基本逻辑电路,想到一个问题:为什么CP ...

  10. 编译c语言程序扩展ruby

    环境: windows 10 64bit ruby 2.2.4p230 (2015-12-16 revision 53155) [i386-mingw32] gcc version 4.8.1 (GC ...