• 设计模式-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 - 针对用户服务 - 装饰的扩展方法   ... ... " + "
    ");
        }
    
        /**
         * 针对装饰的方法进行装饰
         */
        @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 - 针对用户服务 - 装饰的扩展方法   ... ... " + "
    ");
        }
    
        /**
         * 针对装饰的方法进行装饰
         */
        @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 - 针对用户服务 - 装饰的扩展方法   ... ... 
  • 相关阅读:
    CentOS怎样强制卸载PHP以及自定义安装PHP
    HTMLparser 笔记
    linux如何查看CPU,内存,机器型号,网卡信息
    PC机做ISCSI存储服务器故障
    [ Python
    [ Python
    [ Python
    [ Python
    [ Python
    [ Python
  • 原文地址:https://www.cnblogs.com/wanhua-wu/p/7221609.html
Copyright © 2020-2023  润新知