组和问题(比如:星巴克咖啡(当单品咖啡+其他赠品组和太多会导致类爆炸))
1、装饰模式(Decorator)也叫包装器模式(Wrapper)。
2、装饰模式降低系统的耦合度,可以动态的增加或删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化,一便增加新的具体构建类和具体装饰类。
优点
1、扩展对象功能,比继承灵活,不会导致类个数急剧增加。
2、可以对一个对象进行多次装饰,创造出不同行为的组合,得到功能更加强大的对象。
3、具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构件子类和具体装饰子类。
缺点
1、产生很多小对象。大量小对象占据内存,一定程度上影响性能。
2、装饰模式易于出错,调试排查比较麻烦。
装饰模式和桥接模式的区别
两个模式都是为了解决过多子类对象问题。但他们用途不一样。桥接模式是对象自身现有机制沿着多个维度变化,是即有部分不稳定。装是模式是为了增加新的功能。
package com.zjc.designmode.decorator;
/**
* @author : zoujc
* @date : 2020/11/10
* @description :创建一个接口
*/
public interface Shape {
void draw();
}
package com.zjc.designmode.decorator;
/**
* @author : zoujc
* @date : 2020/11/10
* @description :实现接口的实体类。
*/
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("图形: 圆形");
}
}
package com.zjc.designmode.decorator;
/**
* @author : zoujc
* @date : 2020/11/10
* @description :实现接口的实体类。
*/
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("图形: 长方形");
}
}
package com.zjc.designmode.decorator;
/**
* @author : zoujc
* @date : 2020/11/10
* @description :实现了 Shape 接口的抽象装饰类。
*/
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
@Override
public void draw(){
decoratedShape.draw();
}
}
package com.zjc.designmode.decorator;
/**
* @author : zoujc
* @date : 2020/11/10
* @description :扩展了 ShapeDecorator 类的实体装饰类
*/
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape){
System.out.println("边的颜色: 红色");
}
}
package com.zjc.designmode.decorator;
/**
* @author : zoujc
* @date : 2020/11/10
* @description :
*/
public class Client {
public static void main(String[] args) {
Shape circle = new Circle();
ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
//Shape redCircle = new RedShapeDecorator(new Circle());
//Shape redRectangle = new RedShapeDecorator(new Rectangle());
circle.draw();
redCircle.draw();
redRectangle.draw();
}
}
JDK中的InputStream用到了装饰者模式
InputStream是抽象类
FileInputStream是InputStream子类
FilterInputStream是InputStream子类(修饰者)
DataInputStream是FilterInputStream的子类(修饰者)
FilterInputStream有protected volatile InputStream in; 即含被装饰者