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

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

相关推荐
面朝大海,春不暖,花不开5 分钟前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
得过且过的勇者y6 分钟前
Java安全点safepoint
java
夜晚回家41 分钟前
「Java基本语法」代码格式与注释规范
java·开发语言
斯普信云原生组1 小时前
Docker构建自定义的镜像
java·spring cloud·docker
wangjinjin1801 小时前
使用 IntelliJ IDEA 安装通义灵码(TONGYI Lingma)插件,进行后端 Java Spring Boot 项目的用户用例生成及常见问题处理
java·spring boot·intellij-idea
wtg44521 小时前
使用 Rest-Assured 和 TestNG 进行购物车功能的 API 自动化测试
java
白宇横流学长1 小时前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
fat house cat_2 小时前
【redis】线程IO模型
java·redis
stein_java3 小时前
springMVC-10验证及国际化
java·spring
weixin_478689763 小时前
C++ 对 C 的兼容性
java·c语言·c++