JAVA设计模式——装饰设计模式

本文探讨了在JAVA中使用装饰设计模式来增强已有对象功能的优点。相较于继承,装饰模式提供了更大的灵活性和扩展性,避免了类体系的臃肿。通过现实生活中汽车功能增强的例子,阐述了装饰模式如何在不改变原有对象的基础上,轻松添加新功能。

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

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

想要对已有的对象进行功能的增强

可以定义类,将已有对象传入,基于已有的功能,提供加强功能

那么自定义的这个类就被称之为装饰类


举个简单的例子:

/**
 * 装饰类示例
 * @author Shawn·Zhang
 */

class Person{
	public void eat() {
		System.out.println("吃饭");
	}
}

//要求:增强吃饭方法,并且不能改变原有代码
//分析:这时,我们需要定义一个类,来增强,也就是对之前Person类进行修饰
//我们新建一个SuperPerson类进行装饰
class SuperPerson{//装饰类
	private Person p;
	public SuperPerson(Person p) {//有参构造方法,参数为被装饰对象
		this.p = p;
	}
	public void superEat(){
		System.out.println("开胃酒");
		p.eat();
		System.out.println("餐后甜点");
		
	}
}

public class PersonDemo {

	public static void main(String[] args) {
		Person p = new Person();
		SuperPerson sp = new SuperPerson(p);
		sp.superEat();
	}

}

到这里可以发现,如果我们继承Person类同样可以实现该功能,为何要用装饰设计模式呢?

这也就引入了装饰设计模式对比继承的优势了

可以看到,装饰是创建有参构造函数,通过参数的传递来实现功能的增强

而继承,则是为了增强功能而重新创建一个子类,这样会使得整个体系变得臃肿


装饰类相比继承,保持了灵活性强扩展性强等特点,并且减少类和类之间的联系,也避免体系的臃肿


下面引入一个现实生活中的案例,以便理解:

例如一辆汽车,在满足基本的功能上面,假如你需要增加某些功能,只需要增加即可,而不需要将汽车拆了重新组装,这样的例子就能很好的说明装饰设计模式的好处

/**
 * 包装设计模式
 * 汽车
 *   |--桑塔纳
 *   	  |--倒车影像
 *   |--索纳塔
 *   	  |--自动泊车
 *   
 * 装饰模式后	
 * 汽车
 *   |--桑塔纳	
 *   |--索纳塔 
 *   |--倒车影像
 *   |--自动泊车
 * @author Shawn·Zhang
 *
 */

abstract class Car{//抽象类
	abstract void show();
}

class Santana extends Car{
	@Override
	public void show() {
		System.out.println("桑塔纳");
	}
}

class Sonata extends Car{
	@Override
	void show() {
		System.out.println("索纳塔");
	}
}

class RadarCar{
	private Car car;
	public RadarCar(Car car) {
		this.car = car;
	}
	public void show(){
		car.show();
		System.out.println("具有倒车影像功能");
	}
}


public class MyCar {

	public static void main(String[] args) {
		Car car = new Santana();
		System.out.println("-------------------包装前-------------------");
		car.show();
		RadarCar rcar = new RadarCar(car);
		System.out.println("-------------------包装后-------------------");
		rcar.show();
	}
}

PS:自动泊车和倒车影像同理,代码中没有写明。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值