经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Java中常用的设计模式之装饰器模式详解
来源:jb51  时间:2022/2/28 8:51:30  对本文有异议

优点

1.装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点

2.多层装饰比较复杂。

使用场景

1.扩展一个类的功能。

2.动态增加功能,动态撤销。

一、实现方式

假设一个场景,我们房间每天起床都要刷牙, 睡觉也要刷牙,刷牙的动作就是一个装饰器的作用,这样更利于我们的口腔健康。接下来我们就看看具体的装饰器如何实现。

1、每天生活的接口

  1. package com.asurplus.common.decorator;
  2. /**
  3. * 每天的生活接口
  4. */
  5. public interface Live {
  6. /**
  7. * 每天需要做的事情
  8. */
  9. void live();
  10. }

2、起床的实现类

  1. package com.asurplus.common.decorator;
  2. import lombok.extern.slf4j.Slf4j;
  3. /**
  4. * 起床实现类
  5. */
  6. @Slf4j
  7. public class GetUpLive implements Live {
  8. @Override
  9. public void live() {
  10. log.info("起床了");
  11. }
  12. }

3、睡觉的实现类

  1. package com.asurplus.common.decorator;
  2. import lombok.extern.slf4j.Slf4j;
  3. /**
  4. * 睡觉实现类
  5. */
  6. @Slf4j
  7. public class SleepLive implements Live {
  8. @Override
  9. public void live() {
  10. log.info("睡觉了");
  11. }
  12. }

4、装饰器类

  1. package com.asurplus.common.decorator;
  2. import lombok.extern.slf4j.Slf4j;
  3. /**
  4. * 装饰器类
  5. */
  6. @Slf4j
  7. public class LiveDecorator {
  8. private Live live;
  9. public LiveDecorator(Live live) {
  10. this.live = live;
  11. }
  12. public void live() {
  13. // 生活
  14. live.live();
  15. // 刷牙
  16. brushTeeth();
  17. }
  18. private void brushTeeth() {
  19. log.info("刷牙去咯");
  20. }
  21. }

二、测试

  1. package com.asurplus.common.decorator;
  2. /**
  3. * 装饰器模式
  4. */
  5. public class TestMain {
  6. public static void main(String[] args) {
  7. // 起床
  8. LiveDecorator getUp = new LiveDecorator(new GetUpLive());
  9. getUp.live();
  10. System.out.println();
  11. // 睡觉
  12. LiveDecorator sleep = new LiveDecorator(new SleepLive());
  13. sleep.live();
  14. }
  15. }

输出结果

在这里插入图片描述

可以看出,起床和睡觉,都刷了牙,从而实现了我们的装饰器模式。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注w3xue的更多内容!  

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号