设计模式-10-装饰器

Posted wanhua.wu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-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 - 针对用户服务 - 装饰的扩展方法   ... ... 

 

以上是关于设计模式-10-装饰器的主要内容,如果未能解决你的问题,请参考以下文章

设计模式9装饰器模式

10.9-全栈Java笔记:装饰器模式构建IO流体系

GO设计模式10装饰器模式

装饰器相关

类中的装饰器在Pycharm中抛出警告

编程模式之Go语言如何实现装饰器