设计模式<装饰器模式>

装饰器模式

定义

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

首先我们先来定义一个使用场景(画图功能),并模拟需求变更过程。

NOTE:程序的设计重要性

一. 初次设计:只需要画出图形就可以(比如:正方形,圆形)

  • 定义一个接口
package com.devil.java.decorator;

/**
 * 
 * @author devil 定义一个形状的画图接口
 */
public interface Shape {

    /**
     * 画图接口,直接画出图形
     */
    public void draw();
}
  • 实现一个矩形
package com.devil.java.decorator;

/**
 * 
 * @author devil 定义一个矩形的实体类
 */
public class Rectangle implements Shape {

    @Override
    public void draw() {
        // 画图的功能根据实际的业务来在做处理,这里只做一个简单的打印信息处理
        System.out.println("画出了一个矩形!");
    }

}
  • 测试
package com.devil.java.decorator;

/**
 * 
 * @author devil 设计模式的主入口
 */
public class DecoratorMain {

    public static void main(String[] args) {

        // 画一个矩形
        Shape shape = new Rectangle();
        // 实际画图
        shape.draw();
    }

}
  • 输出
画出了一个矩形!

二. 需求变更: 画图时还需要有填充色(比如:红色,绿色)

分析新添加的需求

画出矩形的功能已经有了(NOTE:相同的代码不需要在重复编写),需要添加一个填充颜色的功能

  • 定义一个画图的装饰器
package com.devil.java.decorator;

/**
 * 
 * @author devil 定一个画图的装饰器
 */
public abstract class ShapeDecorator implements Shape {

    /**
     * 画图(NOTE:public private protected default的区别根据实际情况使用)
     */
    protected Shape shape;

    /**
     * 添加一个构造函数
     * 
     * @param shape
     *            画图
     */
    public ShapeDecorator(Shape shape) {
        this.shape = shape;
    }
}
  • 矩形装饰器的具体实现
package com.devil.java.decorator;

public class RectangleDecorator extends ShapeDecorator {

    // 默认的填充颜色
    private String color = "白色";

    /**
     * 默认的构造函数
     * 
     * @param shape
     *            画图
     */
    public RectangleDecorator(Shape shape) {
        super(shape);
    }

    /**
     * 带颜色的构造函数
     * 
     * @param shape
     *            画图
     * @param color
     *            颜色
     */
    public RectangleDecorator(Shape shape, String color) {
        super(shape);
        this.color = color;
    }

    @Override
    public void draw() {
        // 调用原始的画图方法
        this.shape.draw();
        // 新建的颜色填充方法
        this.fullColor();

    }

    /**
     * 新添加的功能填充颜色
     */
    private void fullColor() {
        System.out.println("填充的颜色是:" + this.color);
    }
}
  • 测试
package com.devil.java.decorator;

/**
 * 
 * @author devil 设计模式的主入口
 */
public class DecoratorMain {

    public static void main(String[] args) {

        System.out.println("<简单只画图>");
        // 画一个矩形
        Shape shape = new Rectangle();
        // 实际画图
        shape.draw();
        System.out.println("..............................");
        System.out.println("");
        System.out.println("<需求变更后>");
        // 画一个默认填充色的矩形
        Shape shape1 = new RectangleDecorator(new Rectangle());
        shape1.draw();
        System.out.println("..............................");
        System.out.println("");
        // 画一个给定颜色为蓝色的矩形
        Shape shape2 = new RectangleDecorator(new Rectangle(), "蓝色");
        shape2.draw();
    }

}
  • 输出
这里写代码片<简单只画图>
画出了一个矩形!
..............................

<需求变更后>
画出了一个矩形!
填充的颜色是:白色
..............................

画出了一个矩形!
填充的颜色是:蓝色

总结

现在的java编程都是面向对象和接口编程,调用者之需要知道调用shape的draw方法可以画出图形(NOTE:因为这接口在这之前就已经定义好),至于调用有填充色的画图还是没有填充色的画图这是一个选择问题,但是对于我们添加填充色功能来说不能改变原先的程序设计结构,换句话说就是,调用draw就可以画图(有颜色或者没有颜色),这个是没有改变的。
代码的实现都是其次的重要的是理解这种设计模型的意义和作用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值