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

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

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

  这里,我们假定有个操作的接口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. Material使用01 侧边栏MdSidenavModule、工具栏MdTollbarModule

    前提准备: 构建好一个Angular2应用 熟悉CSS的flex布局风格 1 利用flex进行布局 1.1 创建三个组件 app-header app-main app-footer 1.2 在主组件 ...

  2. PHP运算符优先级 运算符分类

    运算符 运算符是可以通过给出的一或多个值(用编程行话来说,表达式)来产生另一个值(因而整个结构成为一个表达式)的东西. 运算符可按照其能接受几个值来分组.一元运算符只能接受一个值,例如 !(逻辑取反运 ...

  3. JavaWeb学习总结(三)——Tomcat服务器学习和使用(二)(转)

    转载自 http://www.cnblogs.com/xdp-gacl/p/3744053.html 一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWe ...

  4. JNI参考的资料

    1.Android JNI和NDK学习(09)--JNI实例二 传递类对象 http://www.cnblogs.com/skywang12345/archive/2013/05/26/3093593 ...

  5. 新书《Linux就是这个范儿》预售

    预售地址 当当 内容简单介绍 本书内容源自淘宝技术大学的培训实战.由来自阿里巴巴集团的资深Linux系统专家赵鑫磊和相同来自阿里巴巴集团的支付宝网络技术有限公司的高级专家Jie Zhang(张洁)共同 ...

  6. 开源Android-PullToRefresh下拉刷新源代码分析

    PullToRefresh 这个库用的是很至多.github  今天主要分析一下源代码实现. 我们通过ListView的下拉刷新进行分析.其他的类似. 整个下拉刷新  父View是LinearLayo ...

  7. Git(二)Git几个区的关系与Git和GitHub的关联

    前言 前面只是大概的介绍了一点基础的东西,接下来会更加深入的去了解一下Git. 一.Git的工作区.暂存区和版本库之间的区别和联系 1)工作区 在PC中能看得到的创建的一个管理仓库的目录.比如目录下G ...

  8. MPSOC之7——开发流程uramdisk

    用petalinux的预编译目录里有rootfs文件,选择rootfs.tar.gz作为初始输入. 1.原始文件-->uramdisk 1.1 解压原始rootfs.tar.gz,得到若干文件 ...

  9. SQL Server 全文索引的管理

    全文索引不同于常见的聚集索引或非聚集索引,这些索引的内部实现是平衡树(B-Tree)结构,而全文索引在物理上是由一系列的内部表(Internal tables)构成的,这些内部表称作全文索引片段(Fr ...

  10. java 对象的初始化过程

    PersonDemo p=new PersonDemo("lisi",20);这句话都做了什么事情? 因为new用到了PersonDemo.class,所以会先找到PersonDe ...