設計模式-10-裝飾器
阿新 • • 發佈:2017-07-22
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 abstractclass 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-裝飾器