设计模式-10-装饰器

简介:动态地往一个类中添加新的行为

目的:不改变原类,不使用继承,动态扩展

总结:不改变原类和使用继承的情况下,动态的扩展一个对象的功能; 通过装饰来创建一个包装对象

组成: 被装饰对象, 装饰器接口, 装饰器实现

1,被装饰对象

package com.design.j.decorator;
/**
 * 用户接口服务
 */
public interface UserService {

    /**
     * 用户信息修改
     */
    void updateUserInfo(Long userId);

}
package com.design.j.decorator;
/**
 * 用户接口服务的实现
 */
public class UserServiceImpl implements UserService {

    @Override
    public void updateUserInfo(Long userId) {
        System.out.println("用户服务接口:  用户信息修改  。。。 。。。userId=" +userId);
    }

}

2,装饰器接口

package com.design.j.decorator;
/**
 * 针对UserService的抽象装饰器
 */
public abstract class Decorator implements UserService{

    //装饰器装饰的目标服务
    protected UserService userService;
    public Decorator(UserService userService){
        super();
        this.userService = userService;
    }

    //待装饰的方法
    @Override
    public void updateUserInfo(Long userId) {
        userService.updateUserInfo(userId);
    }

}

3,装饰器实现

package com.design.j.decorator;
/**
 * 装饰器A
 */
public class DecoratorA extends Decorator {

    public DecoratorA(UserService userService) {
        super(userService);
    }

    /**
     * 装饰器A - 扩展方法
     */
    public void methodA(){
        System.out.println("装饰器A - 针对用户服务 - 装饰的扩展方法   ... ... " + "\n");
    }

    /**
     * 针对装饰的方法进行装饰
     */
    @Override
    public void updateUserInfo(Long userId) {
        System.out.println("装饰器A - 针对用户修改方法 - 添加的包装   - starting ... ... ");
        super.updateUserInfo(userId);
        System.out.println("装饰器A - 针对用户修改方法 - 添加的包装   - end ... ... ");
    }

}
package com.design.j.decorator;
/**
 * 装饰器B
 */
public class DecoratorB extends Decorator{

    public DecoratorB(UserService userService) {
        super(userService);
    }

    /**
     * 装饰器B的扩展方法
     */
    public void methodB(){
        System.out.println("装饰器B - 针对用户服务 - 装饰的扩展方法   ... ... " + "\n");
    }

    /**
     * 针对装饰的方法进行装饰
     */
    @Override
    public void updateUserInfo(Long userId) {
        System.out.println("装饰器B - 针对用户修改方法 - 添加的包装   - starting ... ... ");
        super.updateUserInfo(userId);
        System.out.println("装饰器B - 针对用户修改方法 - 添加的包装   - end ... ... ");
    }

}

4,Main

package com.design.j.decorator;
/**
 * 10-装饰器 - 模式
 */
public class MainTest {

    public static void main(String[] args){

        UserService userService = new UserServiceImpl();

        System.out.println("--------原始方法----开始-------------------");
        userService.updateUserInfo(1001L);

        DecoratorA decoratorA = new DecoratorA(userService);
        System.out.println("--------装饰器A----开始-------------------");
        decoratorA.updateUserInfo(1001L);
        decoratorA.methodA();

        DecoratorB decoratorB = new DecoratorB(userService);
        System.out.println("--------装饰器B----开始-------------------");
        decoratorB.updateUserInfo(1001L);
        decoratorB.methodB();

        decoratorB = new DecoratorB(decoratorA);
        System.out.println("--------装饰器A && 装饰器B----开始-------------------");
        decoratorB.updateUserInfo(1001L);
        decoratorB.methodB();
    }

}

5,Result

--------原始方法----开始-------------------
用户服务接口:  用户信息修改  。。。 。。。userId=1001
--------装饰器A----开始-------------------
装饰器A - 针对用户修改方法 - 添加的包装   - starting ... ...
用户服务接口:  用户信息修改  。。。 。。。userId=1001
装饰器A - 针对用户修改方法 - 添加的包装   - end ... ...
装饰器A - 针对用户服务 - 装饰的扩展方法   ... ... 

--------装饰器B----开始-------------------
装饰器B - 针对用户修改方法 - 添加的包装   - starting ... ...
用户服务接口:  用户信息修改  。。。 。。。userId=1001
装饰器B - 针对用户修改方法 - 添加的包装   - end ... ...
装饰器B - 针对用户服务 - 装饰的扩展方法   ... ... 

--------装饰器A && 装饰器B----开始-------------------
装饰器B - 针对用户修改方法 - 添加的包装   - starting ... ...
装饰器A - 针对用户修改方法 - 添加的包装   - starting ... ...
用户服务接口:  用户信息修改  。。。 。。。userId=1001
装饰器A - 针对用户修改方法 - 添加的包装   - end ... ...
装饰器B - 针对用户修改方法 - 添加的包装   - end ... ...
装饰器B - 针对用户服务 - 装饰的扩展方法   ... ... 
时间: 2024-10-22 20:39:08

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

java设计模式之 装饰器模式

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

php设计模式之装饰器模式

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

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

职责:动态的为一个对象增加新的功能 装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能.使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀. 实现细节: ——Component抽象构件角色:真实对象和装饰对象有相同的接口.这样,客户端对象就能够以与真实对象相同的方式同装饰对象交互. ——ConcreteComponent具体构件角色(真实对象):io流中的FileInputStream. FileOutputStream ——Decorator装饰角色

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

装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 通过采用组合.而非继承的手法,Decorator模式实现了在运行时动态地扩展对象功能的能力,而且可以根据需要扩展多个功能.避免了单独使用继承带来的“灵活性差"和"多子类衍生问题". 优点:装饰类和被装饰类可以独立发

python设计模式之装饰器模式

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

设计模式之: 装饰器模式

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

java设计模式之装饰器模式

装饰器模式的应用场景:1.需要扩展一个类的功能.2.动态的为一个对象增加功能,而且还能动态撤销.(继承不能做到这一点,继承的功能是静态的,不能动态增删.) 源接口: 1 public interface Sourceable { 2 3 void method(); 4 } Source类: 1 public class Source implements Sourceable { 2 @Override 3 public void method() { 4 System.out.println

设计模式之装饰器模式

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

Java常用的设计模式07:常用设计模式之装饰器模式

1. Java之装饰器模式(Decorator Pattern) (1)概述:     装饰模式在Java种使用也很广泛,比如我们在重新定义按钮.对话框等时候,实际上已经在使用装饰模式了.在不必改变原类文件和使用继承的情况下,动态    地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.     装饰者模式:动态地给一个对象添加一些额外的职责,就像在墙上刷油漆一样.就增加功能来说,Decorator模式比生成子类更为灵活. Decorator模式的工作原理是:可以创建始

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

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