设计模式(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):桥接模式

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

相关推荐
小灰灰要减肥29 分钟前
装饰者模式
java
张铁铁是个小胖子40 分钟前
MyBatis学习
java·学习·mybatis
诸葛悠闲1 小时前
设计模式——桥接模式
设计模式·桥接模式
Yan.love1 小时前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶1 小时前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥1 小时前
java提高正则处理效率
java·开发语言
智慧老师2 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm2 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
V+zmm101343 小时前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
Oneforlove_twoforjob3 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存