黑马程序员_设计模式之装饰模式

本文深入探讨装饰模式,一种在不修改原始类文件和使用继承的情况下,动态扩展对象功能的技术。通过实例演示如何使用装饰模式实现功能扩展,并讨论其优缺点。

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



------------------------------------------------android培训java培训期待与您交流!-----------------------------------------------

概念
装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象

特点

1.装饰对象和真实对象有相同的接口这样客户端对象就可以和真实对象相同的方式和装饰对象交互
2.装饰对象包含一个真实对象的引用(reference)
3.装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
4.装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展

装饰模式UML图

❹装饰模式的实现

装饰模式是利用setComponent来对对象进行包装的

//该接口定义操作
public interface Component
{
	public void operation();
}

//该类具体实现该操作,可以说是系统最核心的主要行为
public class ConcreteComponent implements Component
{

	@Override
	public void operation()
	{
		System.out.println("完成了一大堆的复杂操作");
	}

}
//该抽象类用于扩展装饰类,实现了接口方便调用
//装饰类只有在某种特殊的情况下才会被调用
public abstract class Decorator implements Component
{
	//保存一个引用组件类
	protected Component component;
	public void setComponent(Component component)
	{
		this.component=component;
	}
	@Override
	public void operation()
	{
		//调用具体组件类的实现
		if(component!=null)
		{
			component.operation();
		}
	}
	
}

//继承Decorator类并复写operation函数并加上要装饰的内容
public class ConcreteDecoratorA extends Decorator
{

	@Override
	public void operation()
	{
		//相当于调用ConcreteComponent里面的operation方法
		super.operation();
		System.out.println("装饰功能1");
	}
	
}

public class MainClass
{
	public static void main(String[] args)
	{
		ConcreteComponent component=new ConcreteComponent();
		ConcreteDecoratorA a=new ConcreteDecoratorA();
		ConcreteDecoratorB b=new ConcreteDecoratorB();
		//连续装饰component两次
		a.setComponent(component);
		b.setComponent(a);
		a.operation();
	}
}

自己的总结:ConcreteComponent实现了系统最核心和基本的功能,当我们对需求有变化但是需求只是想
改变一下某些装饰作用,不改变原来的功能,如添加日志功能等等,那么我们就可以利用装饰模式

❺优点及缺点

①优点

1.Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性
2.通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合

②缺点

1.这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性
2.装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂


-----------------------------------------android培训java培训、java学习型技术博客、期待与您交流! --------------------------


详情请查看:http://edu.youkuaiyun.com/heima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值