java设计模式学习之装饰者模式

本文介绍了装饰器模式的概念及其应用场景,通过一个具体的例子展示了如何在不改变原有类结构的前提下为其添加新功能,最后给出了一个简单的测试案例。

1.介绍

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
假如当我们想给一个类扩展新的方法的时候,常用的做法是新建一个子类,在子类中使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。当我们在不想增加很多子类的情况下使用装饰器模式扩展类,相比生成子类更为灵活。
java的IO流用到了Decortor(装饰)模式。

2.代码说明

假如有一个形状接口Shape,子类Circle实现了画圆的功能,此时我们想扩展画圆的功能,在画圆的同时给圆上色,用装饰器模式实现如下:
先创建形状接口Shape:

package com.tl.skyLine.pattern.DecoratorPattern;

/**
 * Created by tl on 17/3/8.
 */
public interface Shape {
    void draw();
}

圆形形状:

package com.tl.skyLine.pattern.DecoratorPattern;

/**
 * Created by tl on 17/3/8.
 */
public class Circle implements Shape {

    @Override
    public void draw() {
        System.out.println("画一个圆形形状");
    }
}

装饰对象Decorator和被装饰对象Circle实现同一个接口,装饰对象Decorator持有被装饰对象Circle的实例:

package com.tl.skyLine.pattern.DecoratorPattern;

/**
 * Created by tl on 17/3/8.
 */
public class Decorator implements Shape {
    private Circle shape;

    public Decorator(Circle shape) {
        this.shape = shape;
    }

    private void fillRed() {
        System.out.println("图形被填充为红色!");
    }

    @Override
    public void draw() {
        shape.draw();
        fillRed();
    }
}

测试:

package com.tl.skyLine.pattern.DecoratorPattern;

/**
 * Created by tl on 17/3/8.
 */
public class DecoratorTest {
    public static void main(String[] args) {

        Shape redCircle = new Decorator(new Circle());
        redCircle.draw();
    }
}

结果:
画一个圆形形状
图形被填充为红色!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值