7.结构型-装饰者模式

组和问题(比如:星巴克咖啡(当单品咖啡+其他赠品组和太多会导致类爆炸))

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; 即含被装饰者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值