博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-10-装饰器
阅读量:4488 次
发布时间:2019-06-08

本文共 3822 字,大约阅读时间需要 12 分钟。

简介:动态地往一个类中添加新的行为

目的:不改变原类,不使用继承,动态扩展

总结:不改变原类和使用继承的情况下,动态的扩展一个对象的功能; 通过装饰来创建一个包装对象

 

组成: 被装饰对象, 装饰器接口, 装饰器实现

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 - 针对用户服务 - 装饰的扩展方法   ... ...

 

转载于:https://www.cnblogs.com/wanhua-wu/p/7221609.html

你可能感兴趣的文章
[Web Tools] 实用的Web开发工具
查看>>
ContentProvider
查看>>
欢迎来到Attention的博客
查看>>
获取IOS bundle中的文件
查看>>
document
查看>>
Hadoop下大矩阵乘法Version2
查看>>
iPhone内存溢出——黑白苹果
查看>>
Struts2学习笔记(十二) 类型转换(Type Conversion)(下)
查看>>
tcpdump学习
查看>>
局域网内传输文件速度慢
查看>>
Linux的核心版本(摘抄)
查看>>
CASE表达式
查看>>
zkw线段树
查看>>
作业1226
查看>>
mainline.js主线
查看>>
fseek()
查看>>
Python学习笔记——PyQt控件中文字居中显示
查看>>
JAVA环境下利用solrj二次开发SOlR搜索的环境部署常见错误
查看>>
Beta阶段敏捷冲刺前准备
查看>>
mini web框架-3-替换模板
查看>>