Java 装饰器的简要理解

本文围绕Java装饰器模式展开,介绍其又被称为包装模式,是以对客户端透明的方式扩展对象功能,是继承关系的替代方案。基于对象组合方式,阐述了其结构、角色,还给出例子,并分析了该模式优缺点,如更灵活但查错较难。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 装饰器的简要理解

开发工具与关键技术:java、 elipse2019、jdk1.8 
作者:Amewin	
撰写时间:2019年5月8日

装饰器模式

装饰器模式又称为包装(Wrapper)模式。装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

装饰器模式的结构

通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类的方式并不可取,在面向对象的设计中,我们应该尽量使用组合对象而不是继承对象来扩展和复用功能,装饰器模式就是基于对象组合的方式的。
装饰器模式以对客户端透明的方式动态地给一个对象附加上了更多的责任。换言之,客户端并不会角色对象在装饰前和装饰后有什么不同。装饰器模式可以在不用创建更多子类的情况下,将对象的功能加以扩展。

装饰器模式中的角色有:

1、抽象构件角色
给出一个抽象接口,以规范准备接受附加责任的对象
2、具体构件角色
定义一个将要接受附加责任的类
3、装饰角色
持有一个构建对象的实例,并定义一个与抽象构件接口一致的接口
4、具体装饰角色
负责给构建对象贴上附加的责任

装饰器模式的例子

package xyz.test02.www;

public class MainZhuangShiLei {
	public static void main(String[] args) {
		Water  waters =new SpringWaterimple();
		Water mikes = new Mike(waters);
		Water sugers = new Sugers(mikes);
		Water waterlll = new Ningneng(sugers);
		System.err.println("价格:"+mikes.jieGe()+"\n"+"产品名称:"+mikes.name()+"\n"+"产品介绍:"+mikes.jieSao());
		System.err.println("价格:"+sugers.jieGe()+"\n"+"产品名称:"+sugers.name()+"\n"+"产品介绍:"+sugers.jieSao());
		System.err.println("价格:"+waters.jieGe()+"\n"+"产品名称:"+waters.name()+"\n"+"产品介绍:"+waters.jieSao());
		System.err.println("价格:"+waterlll.jieGe()+"\n"+"产品名称:"+waterlll.name()+"\n"+"产品介绍:"+waterlll.jieSao());
	}
}
//1.抽象组件
interface Water{
	
	double jieGe();
	
	String name();
	
	String jieSao();
}
//2.具体组件
class SpringWaterimple implements Water{

	String name = "农夫山泉";
	String nameType = "农夫山泉,有点甜";
	@Override
	public double jieGe() {
		return 3;
	}

	@Override
	public String name() {
		return name;
	}

	@Override
	public String jieSao() {
		return nameType;
	}
	
}
//3、抽象装饰类
abstract class waterAdd implements Water {
	private Water water;

	public waterAdd(Water water) {
		this.water = water;
	}
	public String name() {
		return this.water.name();
	}

	public String jieSao() {
		return this.water.jieSao();
	}
	public double jieGe() {
		return this.water.jieGe();
	}
}
//
class Mike extends waterAdd{

	public Mike(Water water) {
		super(water);
	}

	@Override
	public String name() {
		return super.name()+"牛奶农夫山泉。";
	}
	@Override
	public String jieSao() {
		return super.jieSao()+"加牛奶的农夫山泉。";
	}
	@Override
	public double jieGe() {
		return super.jieGe()*3	;
	}
	
}

class Sugers extends waterAdd{

	public Sugers(Water water) {
		super(water);
	}
	@Override
	public String name() {
		return super.name()+"红糖农夫山泉。";
	}
	@Override
	public String jieSao() {
		return super.jieSao()+"加红糖的农夫山泉。";
	}
	@Override
	public double jieGe() {
		return super.jieGe()+3	;
	}
}


class Ningneng extends waterAdd{

	public Ningneng(Water water) {
		super(water);
	}
	public String name() {
		return super.name()+"加柠檬。";
	}
	public String jieSao() {
		return super.jieSao()+"加柠檬的农夫山泉。";
	}
	public double jieGe() {
		return super.jieGe()+10	;
	}
	
	
	
}

装饰器模式的优缺点

优点

1、装饰器模式与继承关系的目的都是要扩展对象的功能,但是装饰器模式可以提供比继承更多的灵活性。装饰器模式允许系统动态决定贴

上一个需要的装饰,或者除掉一个不需要的装饰。继承关系是不同,继承关系是静态的,它在系统运行前就决定了

2、通过使用不同的具体装饰器以及这些装饰类的排列组合,设计师可以创造出很多不同的行为组合

缺点

由于使用装饰器模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是另一方面,由于使用装饰器

模式会产生比使用继承关系更多的对象,更多的对象会使得查错变得困难,特别是这些对象看上去都很像。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值