裝飾模式:
動态的将責任附加給了對象,使對象易于橫向和總想擴充,提供了比繼承更有彈性的替代方案。
我們來看一下代碼片段
建立一個要唱歌的人
/**
* @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