装饰模式:
动态的将责任附加给了对象,使对象易于横向和总想扩展,提供了比继承更有弹性的替代方案。
我们来看一下代码片段
创建一个要唱歌的人
/**
* @author Lichenyi
* @date 2017-7-6
*/
public interface Human {
public void sing();
}
//把这个人包装成为一个歌手
/**
* @author Lichenyi
* @date 2017-7-4
*/
public class Singer implements Human {
@Override
public void sing(){
System.out.println("我唱唱唱......");
}
}
//这个歌手正在唱歌
/**
* @author Lichenyi
* @date 2017-7-5
*/
public class SingerSing extends Singer {
private Singer singer;
public SingerSing(Singer singer){
this.singer = singer;
}
@Override
public void sing() {
singer.sing();
}
}
//装饰A–唱歌的时候伴舞
/**
* @author Lichenyi
* @date 2017-7-5
*/
public class SingerDecorateA extends SingerSing{
public SingerDecorateA(Singer singer) {
super(singer);
}
@Override
public void sing() {
decorate();
super.sing();
}
private void decorate(){
System.out.println("伴舞..");
}
}
//装饰B–唱歌的时候有音乐
/**
* @author Lichenyi
* @date 2017-7-5
*/
public class SingerDecorateB extends SingerSing{
public SingerDecorateB(Singer singer) {
super(singer);
}
@Override
public void sing() {
decorate();
super.sing();
}
private void decorate(){
System.out.println("播放背景音乐..");
}
}
//装饰C–唱歌完毕后,经历介绍
/**
* @author Lichenyi
* @date 2017-7-5
*/
public class SingerDecorateC extends SingerSing{
public SingerDecorateC(Singer singer) {
super(singer);
}
@Override
public void sing() {
super.sing();
decorate();
}
private void decorate(){
System.out.println("经历介绍..");
}
}
优点:其拓展性十分良好,通过使用不同的装饰类来使得对象具有多种多样的属性,灵活性比直接继承好。
缺点:产生了过多的装饰类,代码难于理解,不易于排错。
项目地址:https://github.com/lichenyigit/designModel3-decorate.git