1. 程式人生 > >設計模式-10-裝飾器

設計模式-10-裝飾器

col ring rgs this [] starting 行為 。。 擴展

簡介:動態地往一個類中添加新的行為

目的:不改變原類,不使用繼承,動態擴展

總結:不改變原類和使用繼承的情況下,動態的擴展一個對象的功能; 通過裝飾來創建一個包裝對象

組成: 被裝飾對象, 裝飾器接口, 裝飾器實現

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-裝飾器