简介:动态地往一个类中添加新的行为
目的:不改变原类,不使用继承,动态扩展
总结:不改变原类和使用继承的情况下,动态的扩展一个对象的功能; 通过装饰来创建一个包装对象
组成: 被装饰对象, 装饰器接口, 装饰器实现
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 - 针对用户服务 - 装饰的扩展方法 ... ...