一.装饰器模式职责:
- 动态的为一个对象增加新的功能;
- 装饰器是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能,使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
二.装饰器模式优点:
- 扩展对象功能比较灵活,不会导致类个数急剧增加;
- 可以对一个对象进行多次装饰,创作出不同行为的组合,得到功能更加强大的对象;
- 具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构建子类和具体装饰子类。
三.装饰器模式缺点:
- 产生很多小对象,大量小对象占据内存,一定程度上影响性能;
- 装饰模式易于出错,调试排查比较麻烦。
四.装饰器模式总结:
- 装饰器模式也叫包装器模式
- 装饰器模式降低系统的耦合度,可以动态的增加或删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化,以便增加新的具体构建类和具体装饰类。
五.代码实现
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();
}
}
更多设计模式学习:
设计模式持续更新中...