当前位置: 首页 > article >正文

Java设计模式-7、装饰器模式

装饰器模式

        装饰器模式主要对现有的类对象进⾏包裹和封装,以期望在不改变类对象 及其类定义的情况下,为对象添加额外功能。是⼀种对象结构型模式。需 要注意的是,该过程是通过调⽤被包裹之后的对象完成功能添加的,⽽不 是直接修改现有对象的⾏为,相当于增加了中间层。

Decorator模式比生成子类更为灵活 。装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

  

Component: 对象的接⼝类,定义装饰对象和被装饰对象的共同接⼝;
ConcreteComponent: 被装饰对象的类定义;
Decorator: 装饰对象的抽象类,持有⼀个具体的被修饰对象,并实现接⼝
类继承的公共接⼝;
ConcreteDecorator:  具体的装饰器,负责往被装饰对象添加额外的功
能;

特殊场景:

1. 如果⽤继承来扩展对象⾏为的⽅案难以实现或者根本不可⾏, 你可以使⽤
该模式。
2 .许多编程语⾔使⽤ final 最终关键字来限制对某个类的进⼀步扩展。 复⽤ 最终类已有⾏为的唯⼀⽅法是使⽤装饰模式: ⽤封装器对其进⾏封装。

应用场景:

*Java I/O 中的装饰者模式 ---继承了FilterInputStream的类就是装饰者类
--整个Java IO体系都是基于字符流(InputStream/OutputStream) 和 字节流(Reader/Writer)作为基类
*spring session 中的装饰者模式
*Mybatis 缓存中的装饰者模式

代码:

1. 基类
/**
 * 被装饰对象的基类
 * @author WHM
 *
 */
public abstract class Tea {

	public abstract String desc();

	public abstract double price();
}

2 .原继承基类子类

public class Coffee extends Tea {

	public String desc() {
		return "拿铁";
	}

	public double price() {
		return 10;
	}
}

3. 原继承基类子类2 

public class MilkTea extends Tea {

	public String desc() {
		return "奶茶";
	}

	public double price() {
		return 8;
	}
}

4. 装饰器基类

public class MixDecorator extends Tea {

	private Tea tea;

	public MixDecorator(Tea tea) {
	    this.tea = tea;
	}

	public String desc() {
		return tea.desc();
	}

	public double price() {
		return tea.price();
	}
}

5. 写3个装饰器

/**
 * 布丁装饰器
 * @author WHM
 *
 */
public class Pudding extends MixDecorator {

	  public Pudding(Tea tea) {
	    super(tea);
	  }

	  @Override
	  public String desc() {
	    return super.desc() + "加布丁,";
	  }

	  @Override
	  public double price() {
	    return super.price() + 2;
	  }
}
/**
 * 珍珠装饰器
 * @author WHM
 *
 */
public class Pearl extends MixDecorator {

	public Pearl(Tea tea) {
		super(tea);
	}

	public String desc() {
		return super.desc() + "加珍珠,";
	}

	public double price() {
		return super.price() + 1;
	}
}
/**
 * 燕麦装饰器
 * @author WHM
 *
 */
public class Oats extends MixDecorator {

	public Oats(Tea tea) {
		super(tea);
	}

	public String desc() {
		return super.desc() + "加燕麦,";
	}

	public double price() {
		return super.price() + 1;
	}
}

6. 验证   一定要注意装修的顺序,这里可以结合责任链模式一起使用

/**
 * 场景:先定奶茶/咖啡   ;后加布丁,珍珠
 * @author WHM
 *
 */
public class TMain {

	public static void main(String[] args) {
		Tea tea;
	    tea = new Coffee();
	    System.out.println(tea.desc()+"销售价格:"+tea.price());

	    tea = new MilkTea();
	    tea = new Oats(tea);
	    tea = new Pearl(tea);
	    tea = new Pudding(tea);
	    System.out.println(tea.desc() + "销售价格:"+tea.price());
	}

}

7. 结果

总结:

装饰模式其实就是在已有的功能动态的添加更多功能的一种方式。在房子上装修。

但是装修顺序一定要注意。


http://www.kler.cn/a/5098.html

相关文章:

  • Nacos server 2.4.0 版本已知问题和 Bug 汇总
  • 6 分布式限流框架
  • Ruby语言的软件开发工具
  • 1688平台商品关键词搜索的多样性与Python爬虫应用实践
  • 微信小程序实现长按录音,点击播放等功能,CSS实现语音录制动画效果
  • 【电子通识】PWM驱动让有刷直流电机恒流工作
  • 【华为OD机试真题JAVA】两个数和两数之和绝对值问题
  • BO OLAP 连接 HANA 先决条件
  • 【SSM】MyBatis(十一.MyBatis的高级映射和延迟加载)
  • 设计模式——装饰者模式
  • satellite.js库下载、介绍、安装、引用,返回函数的方法
  • chatgpt-retrieval-plugin:chatgpt检索插件简介
  • 读《刻意练习》后感,与原文好句摘抄
  • linux串口通信
  • 硬件语言Verilog HDL牛客刷题day04 序列检测部分
  • 线程安全、线程同步(同步代码块、同步方法、同步锁)
  • 【Linux】gcc/g++区别和联系
  • docker私有仓库,仓库管理器
  • 程序监控报警失败自动重启脚本
  • 【不同入参ajax请求】ajax请求接口入参form形式和body形式如何写前端代码(附源码详解)
  • Appium 自动化测试从入门到精通,零基础也能听懂
  • 掌握C语言的这3个函数,你就学会随机读写文件了
  • 二战华为成功上岸,准备了小半年,要个27k应该也算不上很高吧~
  • redis 三. hash应用场景及底层分析
  • PCIe基础
  • 第15章_存储过程与函数