博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(十)装饰器模式
阅读量:5785 次
发布时间:2019-06-18

本文共 1487 字,大约阅读时间需要 4 分钟。

装饰器模式是一种非常有用的结构型模式,它允许我们在不改变类的结果的情况下,为类添加新的功能。

我们来举例说明一下。首先添加一组形状,它们都实现了形状接口。

public interface Shape {    String getShape();}class Square implements Shape{    @Override    public String getShape() {        return "正方形";    }}class Circle implements Shape{    @Override    public String getShape() {        return "圆";    }}

然后再来定义装饰器。装饰器同样需要实现Shape接口,而且在装饰器中还需要对Shape进行补充(也就是装饰)。

public abstract class ColorDecorator implements Shape {    protected Shape shape;    public ColorDecorator(Shape shape) {        this.shape = shape;    }}class RedDecorator extends ColorDecorator {    public RedDecorator(Shape shape) {        super(shape);    }    @Override    public String getShape() {        return "红色的" + shape.getShape();    }}class BlueDecorator extends ColorDecorator {    public BlueDecorator(Shape shape) {        super(shape);    }    @Override    public String getShape() {        return "绿色的" + shape.getShape();    }}

最后再来验证一下。我们成功在没有修改形状类的前提下,为形状增加了颜色的功能。

public void run() {        Shape square = new Square();        Shape circle = new Circle();        Shape redSquare = new RedDecorator(square);        Shape blueCircle = new BlueDecorator(circle);        System.out.println(redSquare.getShape());        System.out.println(blueCircle.getShape());    }

装饰器模式在很多地方都有使用。在Java里面最经典的使用场景就是Java那一大堆的IO类,例如BufferedInputStream或者 FileOutputStream这样的。Java的IO类库通过多个不同IO类的嵌套,可以实现多种功能(例如缓存)的组合。当然其实Java的IO库是一个反面教材,由于装饰器模式的过度使用,导致系统中类太多太复杂,反而不利于我们学习和使用。在实际使用中我们也要注意设计模式的合理使用,不要为了使用而使用。

转载地址:http://qityx.baihongyu.com/

你可能感兴趣的文章
[Noi2017]整数 BZOJ4942
查看>>
XML 新手入门基础知识(复制,留着自己看)
查看>>
Oracle中插入千万条测试数据
查看>>
“完美”解决微信小程序购物车抛物动画,在连续点击时出现计算错误问题,定时器停不下来。...
查看>>
单例设计模式懒汉式的缺陷
查看>>
Lattice DDR3 ip核仿真过程中的一些问题总结
查看>>
One git command may cause you hacked(CVE-2014-9390)
查看>>
HDU 4251 The Famous ICPC Team Again
查看>>
《Javascript高级程序设计》阅读记录(五):第六章 上
查看>>
单例模式的常见写法
查看>>
2019.2.13 SW
查看>>
页游战斗系统总结
查看>>
java.lang.Integer.toHexString(b[n] & 0XFF)中0XFF使用的必要性
查看>>
Javascript中表达式和语句的区别
查看>>
.resx文件与.cs文件的自动匹配
查看>>
Unity3D中的AI架构模型
查看>>
6.转换器和格式化
查看>>
观察力训练(福尔摩斯演绎法)
查看>>
高效统计Oracle数据表条数
查看>>
[转载]深入理解Java 8 Lambda
查看>>