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

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

hot3.png

装饰器模式

坦白的说装饰模式就是对一组对象的功能进行扩展。对现有对象添加新的功能,又不改变结构。 作为现有类的一个包装

意图:

动态的给对象增加一些额外的功能。装饰器模式比子类继承更灵活。

在不增加子类的情况下扩展类。

使用场景:动态增加一个类的功能,同时可以动态撤销

缺点:多层装饰比较复杂。

主要角色:

抽象接口、具体实现类、装饰类和具体装饰类

例如:

//基础接口public interface Coder {    void code();}
//具体实现类public class Student implements Coder {    @Override    public void code() {        System.out.println("使用Java进行编程。。。");    }}
//装饰类public class JavaCoder implements Coder {    private Student student;    public JavaCoder(Student student) {        this.student = student;    }    @Override    public void code() {        student.code();    }}
//具体装饰类public class JavaWebCoder extends JavaCoder {    public JavaWebCoder(Student student) {        super(student);    }    @Override    public void code() {        super.code();        System.out.println("学习javaweb,然后进行编程");    }}
public static void main(String[] args) {        Coder coder = new JavaWebCoder(new Student());        coder.code();    }

执行结果:

使用Java进行编程。。。学习javaweb,然后进行编程

实际应用:

logger打印日志默认为字符串,现在有个功能,需要打印出json格式的日志。

使用装饰器模式:

装饰器类:

public class DecoratorLogger implements Logger {    public Logger logger;    public DecoratorLogger(Logger logger) {        this.logger = logger;    }        @Override    public void debug(String s, Object o) {        logger.debug(s,o);    }        @Override    public void info(String s) {        logger.info(s);    }    @Override    public void warn(String s) {        logger.warn(s);    }        @Override    public void error(String s) {        logger.error(s);    }        ...}
装饰器具体实现类:public class JSONLogger extends DecoratorLogger {    public JSONLogger(Logger logger) {        super(logger);    }        @Override    public void debug(String s) {        JSONObject jsonObject = new JSONObject();        jsonObject.put("debug", s);        logger.debug(jsonObject.toString());    }        @Override    public void info(String s) {        JSONObject jsonObject = new JSONObject();        jsonObject.put("info", s);        logger.info(jsonObject.toString());    }    @Override    public void error(String s) {        JSONObject jsonObject = new JSONObject();        jsonObject.put("error", s);        logger.error(jsonObject.toString());    }             public static class JSONLoggerFactory {        public static JSONLogger getLogger(Class clazz) {            Logger logger = LoggerFactory.getLogger(clazz);            return new JSONLogger(logger);        }    }}
private JSONLogger logger = JSONLogger.JSONLoggerFactory.getLogger(FileController.class);   @RequestMapping(value = "/upload2", method = RequestMethod.GET)    public String upload2() {        logger.info("file is uploading...");        return "success";    }    执行结果:2018-02-24 11:00:05.850  INFO 11168 --- [nio-8081-exec-6] com.example.demo.web.FileController      : {"info":"file is uploading..."}

转载于:https://my.oschina.net/u/2477500/blog/1623313

你可能感兴趣的文章
discuz X3登录流程分析
查看>>
javascript事件响应
查看>>
通过script标签实现JSONP跨域调用
查看>>
用jQuery实现Ajax
查看>>
***微信公众平台开发: 获取用户基本信息+OAuth2.0网页授权
查看>>
上传图片预览
查看>>
vim编辑器
查看>>
OAF_开发系列14_实现OAF代码动态新增控件
查看>>
程序设计的一些原理
查看>>
iTerm的安装以及配置
查看>>
explore my oracle support using firefox 3.6
查看>>
《社交网站界面设计(原书第2版)》——1.7 反模式的重要性
查看>>
2016上半年DDoS攻击报告:DDoS攻击的规模和攻击频率都在不断攀升
查看>>
混合云、区块链、认知技术,还有哪一样前沿技术是IBM没提到的吗?
查看>>
呼叫中心现场管理人员注意事项
查看>>
第6天:XHTML代码规范
查看>>
阿里云数据库Greenplum版发布啦
查看>>
Cocos2d-x3.2 Progress进度条
查看>>
无法在“EntityFramework”已存在的情况下创建影像复制该文件的解决方案
查看>>
iOS开发UI篇—在UItableview中实现加载更多功能
查看>>