设计模式之---装饰器设计模式

职责:动态的为一个对象增加新的功能

   装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。



实现细节:

——Component抽象构件角色:真实对象和装饰对象有相同的接口。这样,客户端对象就能够以与真实对象相同的方式同装饰对象交互。

——ConcreteComponent具体构件角色(真实对象):io流中的FileInputStream、    FileOutputStream

——Decorator装饰角色:持有一个抽象构件的引用。装饰对象接受所有客户端的请求,并把这些请求转发给真实的对象。这样,就能在真实对象调用前后增加新的功能。

——ConcreteDecorator具体装饰角色:负责给构件对象增加新的责任。



开发中的使用场景:

  IO中输入流和输出流的设计

  Swing包中图形界面构件功能

  Servlet API中提供了一个request对象的Decorator设计模式的默认实现类HttpServletRequestWrapper,HttpServletRequestWrapper类增强了request对象的功能。

  Struts2中,request,response,session对象的处理



1. 创建一个抽象组件ICar接口,并创建具体构建角色以及各个具体装饰角色

 1 package com.ztq.decorator;
 2
 3 /***
 4  * 抽象组件
 5  * @author ZTQ
 6  *
 7  */
 8 public interface ICar {
 9     void move();
10 }
11
12 //ConcreteComponent 具体构件角色(真实对象)
13 class Car implements ICar{
14
15     @Override
16     public void move() {
17         System.out.println("陆地上跑!");
18     }
19
20 }
21
22 class SuperCar implements ICar{
23     private ICar car;
24     public SuperCar(ICar car){
25         this.car = car;
26     }
27
28     @Override
29     public void move() {
30         car.move();
31     }
32
33 }
34
35 //ConcreteDecorator具体装饰角色
36 class FlyCar extends SuperCar{
37
38     public FlyCar(ICar car) {
39         super(car);
40     }
41
42     public void fly(){
43         System.out.println("天上飞");
44     }
45
46     @Override
47     public void move() {
48         super.move();
49         fly();
50     }
51 }
52
53 //ConcreteDecorator具体装饰角色
54 class WaterCar extends SuperCar{
55
56     public WaterCar(ICar car) {
57         super(car);
58     }
59
60     public void swim(){
61         System.out.println("水里游");
62     }
63
64     @Override
65     public void move() {
66         super.move();
67         swim();
68     }
69 }
70
71 //ConcreteDecorator具体装饰角色
72 class AICar extends SuperCar{
73
74     public AICar(ICar car) {
75         super(car);
76     }
77
78     public void autoMove(){
79         System.out.println("自动跑");
80     }
81
82     @Override
83     public void move() {
84         super.move();
85         autoMove();
86     }
87 }

2. 创建测试类Client

 1 package com.ztq.decorator;
 2
 3 public class Client {
 4     public static void main(String[] args) {
 5         Car car = new Car();
 6         car.move();
 7
 8         System.out.println("增加新的功能:飞行");
 9         FlyCar flycar = new FlyCar(car);
10         flycar.move();
11
12         System.out.println("增加新的功能:水里游");
13         WaterCar waterCar = new WaterCar(car);
14         waterCar.move();
15
16         System.out.println("增加两个新的功能,飞行,水里游");
17         WaterCar waterCar2 = new WaterCar(new FlyCar(car));
18         waterCar2.move();
19     }
20 }

结果:

陆地上跑!
增加新的功能:飞行
陆地上跑!
天上飞
增加新的功能:水里游
陆地上跑!
水里游
增加两个新的功能,飞行,水里游
陆地上跑!
天上飞
水里游

UML图:



总结:

  装饰模式(Decorator)也叫包装器模式(Wrapper)

  装饰模式降低系统的耦合度,可以动态的增加或删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化,以便增加新的具体构建类和具体装饰类。

  优点:

  • 扩展对象功能,比继承灵活,不会导致类个数急剧增加
  • 可以对一个对象进行多次装饰,创造出不同行为的组合,得到功能更加强大的对象
  • 具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构件子类和具体装饰子类

  缺点:

  • 产生很多小对象。大量小对象占据内存,一定程度上影响性能
  • 装饰模式易于出错,调试排查比较麻烦

装饰模式和桥接模式的区别:

两个模式都是为了解决过多子类对象问题。但他们的诱因不一样。桥接模式是对象自身现有机制沿着多个维度变化,是既有部分不稳定。装饰模式是为了增加新的功能。

原文地址:https://www.cnblogs.com/xuxinstyle/p/9574202.html

时间: 2024-10-28 12:27:43

设计模式之---装饰器设计模式的相关文章

设计模式之: 装饰器模式

什么是装饰器模式 作为一种结构型模式, 装饰器(Decorator)模式就是对一个已有结构增加"装饰". 适配器模式, 是为现在有结构增加的是一个适配器类,.将一个类的接口,转换成客户期望的另外一个接口.适配器让原本接口不兼容的类可以很好的合作. 装饰器模式是将一个对象包装起来以增强新的行为和责任.装饰器也称为包装器(类似于适配器) 有些设计设计模式包含一个抽象类,而且该抽象类还继承了另一个抽象类,这种设计模式为数不多,而装饰器就是其中之一. 什么时候使用装饰器模式 基本说来, 如果想

【ThinkingInJava】42、装饰器设计模式

/** * 书本:<Thinking In Java> * 功能:装饰器设计模式 * 装饰器模式使用分层对象来动态透明的向单个对象添加责任.装饰器指定包装在最初的对象周围的所有对象都具有相同的基本接口 * 某些事物是可装饰的,可以通过将其他类包装在这个可装饰对象的四周,来将功能分层. * 装饰器是通过使用组合和形式化结构(可装饰物/装饰器层次结构)来实现的,而混型是基于继承的 * 文件:Decoration.java * 时间:2015年4月21日10:18:43 * 作者:cutter_po

装饰器设计模式初探(Java实现)

本篇随笔主要介绍用Java实现简单的装饰器设计模式: 先来看一下装饰器设计模式的类图:  从图中可以看到,我们可以装饰Component接口的任何实现类,而这些实现类也包括了装饰器本身,装饰器本身也可以再被装饰. 下面是用Java实现的简单的装饰器设计模式,提供的是从基本的加入咖啡入手,可以继续加入牛奶,巧克力,糖的装饰器系统. 1 interface Component { 2 void method(); 3 } 4 class Coffee implements Component { 5

java设计模式之 装饰器模式

适AT java设计模式之 装饰器模式 装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,动态给一个对象添提供了额外的功能. 我们通过下面的实例来演示装饰器模式的用法.模拟一个人从想吃饭.找饭店.享受美食.结束吃饭的过程 代码展示: 首先创建一个被修饰的接口 Eat package deco

装饰器设计模式

通俗的讲装饰器就是在不改变对象结构的前提下,扩充对象的功能. 下面以effective java中例题 问题  我想扩充Hash<set>功能,使得能够统计添加过元素的个数? 或许你可能会自定义一个类通过继承扩展,从而实现计数功能,代码如下: package com.effectJava.Chapter2; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; public class I

python设计模式之装饰器模式

装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. import time def log_calls(func): def wrapper(*args,**kwargs): now=time.time() print("Calling{0} with {1} and {2}

php设计模式之装饰器模式

1.介绍 1.装饰器模式(Decorator),可以动态地添加修改类的功能 2.一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法 3.使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性. 2.实例 接下来我们举一个例子,使用php实现一个小画板的功能(画指定颜色图形) 1.没使用装饰器之前的传统方式 1.实现一个画板的类 <?php class Canvas { //保存点阵的一个数组 public $data

设计模式之装饰器模式

一.百科 概述: 23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 特点: (1) 装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. (2) 装饰对象包含一个真实对象的引用(reference) (3) 装饰对象接受所有来自客户端的请求.它把这些请求转发给真实的对象. (4) 装饰对象可以在转发这些请

五分钟一个设计模式之装饰器模式

五分钟一个设计模式,用最简单的方法来描述设计模式.查看更多设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/category/3259443 示例代码 今天实在是想不出什么开场白来引出示例了,也想不出特别有意思的示例了,就用一个很土的例子来描述一下装饰器模式吧. 每个人都要穿衣服,每件衣服都具有某些特定的功能,例如,穿上鞋子的话走路舒服,穿上上衣的话上身不冷,穿上裤子的话腿不冷(你这不废话吗).也就是说,每件衣服都具有特定的