装饰模式

一句话定义

动态的为一个对象添加额外的功能职责,不成为其子类

使用场景

对类的功能进行扩展,又不想直接成为子类

实现要点

1、本质类提出抽象角色,不应该具体实现。 
2、修饰类引用和继承抽象类,具体扩展类重写父类方法。

情景假设

洗了一张自拍照需要对这张照片进行装饰。比如封胶、加框之类

实现步骤

1.创建抽象照片类,定义照片的基本
/**
 * 照片抽象类
 *
 * @author fengzhen
 * @version 1.0, 2017/5/24
 */
public abstract class Photos {
    /**
     * 共有的方法
     */
    abstract String getPhoto();
}
2.创建我的自拍照,继承照片抽象类
/**
 * 自拍照  继承自照片
 *
 * @author fengzhen
 * @version 1.0, 2017/5/24
 */
public class Selfie extends Photos {
    private String name;

    public Selfie(String name) {
        this.name = name;
    }

    @Override
    publicString getPhoto() {
        return name;
    }
}
3.创建抽象装饰类,继承并持有照片类,在抽象方法中扩展了照片类的功能
/**
 * 照片装饰抽象类持有Photos也继承Photos
 *
 * @author fengzhen
 * @version version, 2017/5/24
 */
public abstract class PhotoDecorator extends Photos{
    // 持有装饰对象
    private Photos photo;

    /**
     * 构造方法传入持有的被装饰的对象
     * @param photo 被装饰对象
     */
    public PhotoDecorator(Photos photo) {
        this.photo = photo;
    }

    @Override
    public String getPhoto() {
        return photo.getPhoto();
    }
}
4.创建具体装饰类,集成装饰类,进行装饰
/**
 * 装饰照片类型  将照片包装,封胶
 *
 * @author fengzhen
 * @version 1.0, 2017/5/24
 */
public class PackPhotos extends PhotoDecorator {
    /**
     * 构造方法传入持有的被装饰的对象
     *
     * @param photo 被装饰对象
     */
    public PackPhotos(Photos photo) {
        super(photo);
    }

    @Override
    public String getPhoto() {
        return "封胶包装的" + super.getPhoto();
    }
}
/**
 * 装饰照片类型  将照片放入了相册
 *
 * @author fengzhen
 * @version 1.0, 2017/5/24
 */
public class AlbumPhotos extends PhotoDecorator {
    /**
     * 构造方法传入持有的被装饰的对象
     *
     * @param photo 被装饰对象
     */
    public AlbumPhotos(Photos photo) {
        super(photo);
    }

    @Override
    public String getPhoto() {
        return "放入相册的" + super.getPhoto();
    }
}
5.使用装饰后的照片
    // 装饰模式
    // 创建一个自拍
    Selfie selfie = new Selfie("大帅比的自拍");
    // 创建装饰类
    PackPhotos packPhotos = new PackPhotos(selfie);
    // 调用装饰之后的照片对象方法
    Log.i("info", "onCreate: " + packPhotos.getPhoto());
    AlbumPhotos albumPhotos = new AlbumPhotos(selfie);
    Log.i("info", "onCreate: " + albumPhotos.getPhoto());
打印结果:
    onCreate:==++ 大帅比的自拍
    onCreate:==++ 封胶包装的大帅比的自拍
    onCreate:==++ 放入相册的大帅比的自拍

如此,便实现了不继承照片而对照片功能进行了扩展

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值