装饰模式实现了可以动态地为原对象扩展方法

装饰对象与被装饰的都实现了同一个接口(或抽象类)

举个例子: 工作 可以边吃东西边工作,也可以边喝东西边工作,还可以工作的时候边吃边喝

创建共同接口 WorkComponent

 package com.zhanghaobo.patterns;

 public interface WorkComponent {
public void work();
}

具体工作(被装饰的对象)

 public class ConcreteWork implements WorkComponent {

     @Override
public void work() {
System.out.println("我正在工作"); } }

装饰类

 public class DecoratorWork implements WorkComponent {
private WorkComponent work;
public DecoratorWork(WorkComponent work){
this.work=work;
}
@Override
public void work() {
work.work();
} }

装饰1(喝茶)

 public class DrinkDecorator extends DecoratorWork {

     public DrinkDecorator(WorkComponent work) {
super(work);
}
@Override
public void work() {
super.work();
drinkTea();
}
public void drinkTea(){
System.out.println("顺便喝茶");
} }

装饰2(吃东西)

public class EatDecorator extends DecoratorWork {

    public EatDecorator(WorkComponent work) {
super(work);
} @Override
public void work() {
super.work();
eatSomething();
} public void eatSomething(){
System.out.println("顺便吃东西");
}
}

TEST:

public class Client {
public static void main(String[] args) {
//边喝茶边工作
WorkComponent wc=new DrinkDecorator(new ConcreteWork());
wc.work();
System.out.println("================================");
//边吃东西边工作
WorkComponent wc1=new EatDecorator(new ConcreteWork());
wc1.work();
System.out.println("================================");
//边吃边喝地工作
WorkComponent wc2=new DrinkDecorator(new EatDecorator(new ConcreteWork()));
wc2.work();
System.out.println("================================");
//边喝边吃地工作
WorkComponent wc3=new EatDecorator(new DrinkDecorator(new ConcreteWork()));
wc3.work();
}
}

输出结果:

我正在工作
顺便喝茶
================================
我正在工作
顺便吃东西
================================
我正在工作
顺便吃东西
顺便喝茶
================================
我正在工作
顺便喝茶
顺便吃东西

java设计模式(装饰模式)的更多相关文章

  1. Java设计模式---装饰模式

    装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户 ...

  2. Java设计模式-装饰模式(Decorator)

    顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator类是一个 ...

  3. Java设计模式—装饰模式

    装饰模式是一种比较常见的模式. 定义为:动态的给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更加灵活. 装饰模式的通用类图如下: 装饰模式的构成: 1) 抽象构件(Component ...

  4. Java设计模式——装饰模式

    转载自:http://blog.csdn.net/xu__cg/article/details/53024490 抽象构件 public interface CarInterface { void m ...

  5. Java设计模式学习记录-装饰模式

    前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一 ...

  6. Java设计模式(7)装饰模式(Decorator模式)

    Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这 ...

  7. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  8. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  9. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  10. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

随机推荐

  1. poj 1236 Network of Schools(强连通、缩点、出入度)

    题意:给出一个有向图.1:问至少选出多少个点,才能沿有向边遍历所有节点.2:问至少加多少条有向边,使原图强连通. 分析:第一个问题,缩点后找所有树根(入度为0).第二个问题,分别找出入度为0和出度为0 ...

  2. ISO中AFN的使用步骤

    1.依赖的框架 * MobileCoreServices.framework * SystemConfiguration.framework * Security.framework 2.主头文件:A ...

  3. erl0007 - erlang 远程节点连接的两种方式

    启动连接:erl -setcookie abc -name xxx@192.168.x.x -remsh xxx@192.168.x.y 退出:ctrl + g,q 参考:http://www.cnb ...

  4. 安装rlwrap错误的问题解决方法

     You need the GNU readline library(ftp://ftp.gnu.org/gnu/readline/ ) to build this program.如果安装rlwra ...

  5. C++调试 输出数组内容和数组名

    #include <cstdio> using namespace std; //函数定义 #define printArr(arr,n,format) \ printf("%s ...

  6. synchronized作用范围及用法

    1.多线程的同步: 1.1.同步机制: 在多线程中,可能有多个线程试图访问一个有限的资源,必须预防这种情况的发生.所以引入了同步机制:在线程使用一个资源时为其加锁,这样其他的线程便不能访问那个资源了, ...

  7. Nginx 反向代理、负载均衡、页面缓存、URL重写、读写分离及简单双机热备详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx  (windows下nginx安装.配置与使用) 四.Nginx之反向代理 五.Nginx之负载均衡  (负载均衡算法:nginx负载算法 up ...

  8. As3 计算两个日期之间的天数差

    /*日期转YYYYMMDD*/ formDate.fullYear+""+(formDate.month<10?("0"+formDate.month): ...

  9. Selenium2Library系列 keywords 之 _SelectElementKeywords 之 unselect_from_list(self, locator, *items)

    def unselect_from_list(self, locator, *items): """Unselects given values from select ...

  10. Selenium2Library系列 keywords 之 _SelectElementKeywords 之 select_from_list_by_value(self, locator, *values)

    def select_from_list_by_value(self, locator, *values): """Selects `*values` from list ...