您的位置:首页 > 编程语言 > Java开发

java设计模式--装饰模式

2017-07-06 13:49 507 查看
装饰模式:

动态的将责任附加给了对象,使对象易于横向和总想扩展,提供了比继承更有弹性的替代方案。

我们来看一下代码片段

创建一个要唱歌的人

/**
* @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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息