首页 > 代码库 > 设计模式-10-装饰器

设计模式-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-装饰器