Java中常用的设计模式之装饰器模式详解

作者:Asurplus、 时间:2021-08-28 07:59:15 

优点

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

缺点

2.多层装饰比较复杂。

使用场景

1.扩展一个类的功能。

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

一、实现方式

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

1、每天生活的接口

package com.asurplus.common.decorator;
/**
* 每天的生活接口
*/
public interface Live {
   /**
    * 每天需要做的事情
    */
   void live();
}

2、起床的实现类

package com.asurplus.common.decorator;
import lombok.extern.slf4j.Slf4j;
/**
* 起床实现类
*/
@Slf4j
public class GetUpLive implements Live {
   @Override
   public void live() {
       log.info("起床了");
   }
}

3、睡觉的实现类

package com.asurplus.common.decorator;
import lombok.extern.slf4j.Slf4j;
/**
* 睡觉实现类
*/
@Slf4j
public class SleepLive implements Live {
   @Override
   public void live() {
       log.info("睡觉了");
   }
}

4、装饰器类

package com.asurplus.common.decorator;
import lombok.extern.slf4j.Slf4j;
/**
* 装饰器类
*/
@Slf4j
public class LiveDecorator {
   private Live live;
   public LiveDecorator(Live live) {
       this.live = live;
   }
   public void live() {
       // 生活
       live.live();
       // 刷牙
       brushTeeth();
   }
   private void brushTeeth() {
       log.info("刷牙去咯");
   }
}

二、测试

package com.asurplus.common.decorator;
/**
* 装饰器模式
*/
public class TestMain {
   public static void main(String[] args) {
       // 起床
       LiveDecorator getUp = new LiveDecorator(new GetUpLive());
       getUp.live();
       System.out.println();
       // 睡觉
       LiveDecorator sleep = new LiveDecorator(new SleepLive());
       sleep.live();
   }
}

输出结果

Java中常用的设计模式之装饰器模式详解

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

来源:https://lizhou.blog.csdn.net/article/details/123152191

标签:Java,设计模式,装饰器模式
0
投稿

猜你喜欢

  • Android开发Compose框架使用开篇

    2023-06-08 19:14:19
  • Recyclerview添加头布局和尾布局、item点击事件详解

    2022-04-19 12:38:12
  • Java设计模式之java原型模式详解

    2022-04-01 03:16:40
  • android实现歌词自动滚动效果

    2022-03-16 17:09:10
  • 使用JPA双向多对多关联关系@ManyToMany

    2021-12-04 03:37:12
  • SpringBoot结合Redis配置工具类实现动态切换库

    2022-04-15 14:14:13
  • springboot中通过lua脚本来获取序列号的方法

    2023-05-05 04:25:44
  • 如何在android中使用html作布局文件

    2023-01-14 07:49:10
  • 老生常谈Scanner的基本用法

    2021-08-27 00:34:18
  • SpringCloudAlibaba整合Feign实现远程HTTP调用的简单示例

    2023-11-19 16:16:05
  • 为何Java8需要引入新的日期与时间库

    2023-12-16 06:02:23
  • C# 对XML基本操作代码总结

    2022-08-21 16:09:09
  • 深入理解以DEBUG方式线程的底层运行原理

    2022-07-12 03:19:40
  • Java设计模式之代理模式原理及实现代码分享

    2023-07-15 14:32:58
  • IntellJ IDEA神器使用技巧(小结)

    2023-08-08 22:01:44
  • ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(PagedList.Mvc)

    2023-09-23 08:02:41
  • 深入Android MediaPlayer的使用方法详解

    2023-07-21 21:50:47
  • Android 创建与解析XML(四)——详解Pull方式

    2023-06-03 07:10:23
  • C# 中string.split用法详解

    2023-04-09 13:58:34
  • Java中 ? extends T 和 ? super T的理解

    2022-06-26 19:50:23
  • asp之家 软件编程 m.aspxhome.com