装饰者模式

* 通过使用修饰模式,可以在运行时扩充一个类的功能。

* 原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。

* 装饰类实现新的功能,而在不需要用到新功能的地方,它可以直接调用原来的类中的方法。

* 修饰类必须和原来的类有相同的接口。

* 修饰模式是类继承的另外一种选择。类继承在编译时候增加行为,而装饰模式是在运行时增加行为。

* 当某个类具有多种可组合叠加的行为或属性时,装饰者模式可以通过动态增加装饰类,以避免排列组合,减少需要类的数量。

共同的接口

1 public interface ITree {
2      void show();
3 }

原本的类

1 public class Tree implements ITree {
2
3     @Override
4     public void show() {
5         System.out.println("I am a tree");
6     }
7
8 }

装饰类1

 1 public class DecoratorApple implements ITree {
 2
 3     private ITree tree;
 4
 5     public DecoratorApple(ITree tree) {
 6         super();
 7         this.tree = tree;
 8     }
 9
10     public void show() {
11         tree.show();
12         System.out.println(" with apple");
13     }
14
15 }

装饰类2

 1 public class DecoratorGift implements ITree {
 2
 3     private ITree tree;
 4
 5     public DecoratorGift(ITree tree) {
 6         super();
 7         this.tree = tree;
 8     }
 9
10     public void show() {
11         tree.show();
12         System.out.println("with gift");
13     }
14 }

装饰类3

 1 public class DecoratorSnow implements ITree {
 2
 3     private ITree tree;
 4
 5     public DecoratorSnow(ITree tree) {
 6         super();
 7         this.tree = tree;
 8     }
 9
10     public void show() {
11         tree.show();
12         System.out.println("with snow");
13     }
14 }

使用

 1 public class TestDecorator {
 2
 3     public static void main(String[] args) {
 4
 5         //普通的树
 6         ITree tree = new Tree();
 7
 8         // 装饰成一个苹果树
 9         ITree appleTree = new DecoratorApple(tree);
10         appleTree.show();
11
12         // 进一步装饰雪
13         ITree snowTree = new DecoratorApple(new DecoratorSnow(appleTree));
14         snowTree.show();
15
16         // 装饰成一个圣诞树
17         ITree christmasTree = new DecoratorGift(snowTree);
18         christmasTree.show();
19     }
20 }
时间: 2024-10-18 05:11:38

装饰者模式的相关文章

大话设计模式-装饰者模式C#与Java对比存在的问题

最近看了大话设计模式书中的装饰者模式,然后用C#照着写了一遍,发现运行出来的结果和书上不一样,然后又用Java写了一遍 和书上一样,同样的代码,不同的编译器与运行环境,Java和.NET 下面贴上代码 首先是Java实现 Beverage(饮料抽象类) CondimentDecorator(调料抽象类,继承Beverage) Latte(拿铁饮料,继承Beverage) Mocha(摩卡调料,继承CondimentDecorator) public abstract class Beverage

设计模式---装饰者模式(学习笔记)

首先看装饰者模式的定义:动态的将责任附加到对象上.若要扩展功 能,装饰者提供了比继承更有弹性的替代方案! 先看看<大话设计模式>给出的类图: 实际上,装饰者模式就是:把装饰者对象当成"包装者",换言之,把要装饰的对象作为参数传递到装饰对象里去,然后进行操作.(如果理解不对,希望给指正),下面看代码来理解这个类图: 这是装饰者和需要装饰的具体对象共同的接口: public abstract class Component { abstract void Operation()

【大话设计模式】—— 模板方法模式

一.概念 上一篇文章刚刚讲了[大话设计模式]-- 原型模式,原型模式主要是通过Clone()方法,创建新的对象,免去了初始化的过程.模板方法模式也特别会"偷工减料",把不变的行为搬移到超类,去除子类中的重复代码,将代码的复用优势展现的淋漓尽致.它为我们提供了特定的结构和样式,我们只需关心填充数据内容就好,省心啊- 下面让我们来看一下它的准确定义: 模板方法(TemplateMethod)模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构

大话设计模式_备忘录模式(Java代码)

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 简单描述:一个Memento类,代表Originator中要备份的属性.Originator负责生成备份和还原备份,CareTaker负责存储备份 大话设计模式中的截图: 例子代码: Memento类: 1 package com.longsheng.memento; 2 3 public class Memento { 4 5 private String sta

【大话设计模式】——代理模式

对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. Hibernate支持三种继承映射策略: 使用 subclass 进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态. 使用 joined-subclass 进行映射: 对于继承关系中的子类使用同一个表

【笔记】设计模式——装饰者模式

实现一个类似QQavator功能的代码 1.原始实现 1 //存在的问题: 2 //1.wear*方法出现重复代码,可以重构:实质上为代码结构一致,输出内容相同,可以通过在定义一个基类,在基类中定义抽象的Wear*,在子类中重写: 3 //2.倘若需求中新增某种服饰,需要修改Person类代码,不符合开放--封闭原则: 4 //3.客户端中代码暴露了具体装饰细节,理想情况下只需要提供装饰顺序,装饰细节封装起来: 5 class Person 6 { 7 private string name;

大话设计模式_解释器模式(Java代码)

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 简单描述:一个AbstractExpression类,多个子类,存在一个Interpret方法,转义Context对象的信息.客户端根据信息实例化不同的Expression类,并调用其转义方法(这个过程可以使用简单工厂+反射进行) 大话设计模式中的截图: 代码例子: 假设HTML代码解释器: (1)第一类标签<HTML>(开始)/<HEAD>(头信息)/<BODY&g

大话设计模式_原型模式(Java代码)

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 简单描述:即通过实现接口Cloneable重写方法clone(),使得创建新的拷贝对象不需要一个成员一个成员的重新复制,而且可以提高创建对象的效率 Java中要想实现拷贝使用clone()方法,类必须实现Cloneable接口,并且重写Object类中的clone()方法,调用父类的clone()方法即可实现浅复制 代码如下: WorkExperience类: 1 package com.longsheng.prototy

大话设计模式_模板方法模式(Java代码)

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 简单描述:多个类的行为是差不多的,只是某些局部不一样,则交由父类中抽象出这些子类中相同的部分,父类中定义出不同的部分的接口(方法),这些不同部分的方法则由子类去实现,通过多态,实现代码的重用 大话设计模式中的截图: 例子代码: AbstractClass类: 1 package com.longsheng.templatemethod; 2 3 public

设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法

装饰者模式(Decorator Pattern) Java的IO类 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)参见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decora