设计模式(7):装饰器模式

一.装饰器模式职责:

  • 动态的为一个对象增加新的功能;
  • 装饰器是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能,使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。

二.装饰器模式优点:

  • 扩展对象功能比较灵活,不会导致类个数急剧增加;
  • 可以对一个对象进行多次装饰,创作出不同行为的组合,得到功能更加强大的对象;
  • 具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构建子类和具体装饰子类。

三.装饰器模式缺点:

  • 产生很多小对象,大量小对象占据内存,一定程度上影响性能;
  • 装饰模式易于出错,调试排查比较麻烦。

四.装饰器模式总结:

  • 装饰器模式也叫包装器模式
  • 装饰器模式降低系统的耦合度,可以动态的增加或删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化,以便增加新的具体构建类和具体装饰类。

五.代码实现

1.抽象组件

java 复制代码
/**
 * 抽象组件角色
 */
public interface ICar {
	/**
	 * 移动
	 */
	void move();
}

2.具体组件角色

java 复制代码
/**
 * 具体组件角色(真实角色)
 */
public class Car implements ICar{
	@Override
	public void move() {
		System.out.println("陆地跑。。。。");
	}
}

3.装饰器角色

java 复制代码
/**
 * 装饰器角色
 */
public class SuperCar implements ICar{
	public ICar car;
	public SuperCar(ICar car) {
		this.car = car;
	}
	@Override
	public void move() {
		car.move();
	}
}

4.具体装饰器角色

java 复制代码
/**
 * 天上飞。。。。
 */
public class flyCar extends SuperCar{
	public flyCar(ICar car) {
		super(car);
	}
	public void fly(){
		System.out.println("天上飞。。。。");
	}
	@Override
	public void move() {
		super.move();
		fly();
	}
}
/**
 * 水中游。。。。
 */
public class WaterCar extends SuperCar{
	public WaterCar(ICar car){
		super(car);
	}
	public void swim(){
		System.out.println("水中游。。。。");
	}
	@Override
	public void move() {
		super.move();
		swim();
	}
}
/**
 * 自动跑。。。。
 */
public class IDCar extends SuperCar{
	public IDCar(ICar car) {
		super(car);
	}
	public void autoMove(){
		System.out.println("自动跑。。。。");
	}
	@Override
	public void move() {
		super.move();
		autoMove();
	}
}

5.装饰器调用

java 复制代码
/**
 * 装饰器模式
 */
public class App {
	public static void main(String[] args) {
		Car car=new Car();
		car.move();
		System.out.println("=======添加新功能:飞。。。。");
		flyCar fly=new flyCar(car);
		fly.move();
		
		System.out.println("=======添加新功能:飞、。。。。游、、、、");
		WaterCar water=new WaterCar(fly);
		water.move();
	}
}

更多设计模式学习:

设计模式(1):介绍

设计模式(2):单例模式

设计模式(3):工厂模式

设计模式(4):建造者模式

设计模式(5):原型模式

设计模式(6):桥接模式

设计模式持续更新中...

相关推荐
boy快快长大3 分钟前
【IntelliJ IDEA】插件分享
java·ide·intellij-idea
小蒜学长12 分钟前
校园外卖点餐系统(代码+数据库+LW)
java·数据库·spring boot·后端
翻滚丷大头鱼24 分钟前
Java设计模式之结构型—代理模式
java·设计模式·代理模式
东北南西27 分钟前
设计模式-代理模式
设计模式·typescript·代理模式
ByteBlossom30 分钟前
Java集合源码解析之LinkedList
java·开发语言
青鱼入云31 分钟前
【面试场景题】1GB 大小HashMap在put时遇到扩容的过程
java·数据结构·面试
mask哥40 分钟前
DP-观察者模式代码详解
java·观察者模式·微服务·设计模式·springboot·设计原则
幸幸子.43 分钟前
实验2-代理模式和观察者模式设计
java·开发语言
追寻向上1 小时前
睿联科技2026年秋招内推
java·python·科技
计时开始不睡觉1 小时前
从 @Schedule 到 XXL-JOB:分布式定时任务的演进与实践
java·分布式·spring·xxl-job·定时任务