一句话定义
动态的为一个对象添加额外的功能职责,不成为其子类
使用场景
对类的功能进行扩展,又不想直接成为子类
实现要点
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:==++ 放入相册的大帅比的自拍
如此,便实现了不继承照片而对照片功能进行了扩展