什麼是裝飾模式:
裝飾模式就是動態的爲一個對象添加新的功能,它是一種代替繼承的技術,毋須通過繼承增加子類就能拓展對象功能的模式。
開發中應用場景:
1.IO流中,設計的輸入和輸出
2.Servlet api提供的一個re quest對象的decrator模式的默認實現類HttpServletRequestWrap,遇到wrap字樣的基本都是裝飾模式
3.swing中圖形設計界面的功能
實現例子:
首先是設計裝飾模式接口,然後讓子類實現
/**
* 能力接口
*
* @author liuxg
* @date 2016年5月27日 上午11:46:38
*/
public interface Ability {
void whatAblity(); // 有什麼能力
}
public class Person implements Ability {
@Override
public void whatAblity() {
System.out.println("普通人而已");
}
}
class FlyPerson implements Ability {
private Ability ability;
public FlyPerson(Ability ability) {
this.ability = ability;
}
@Override
public void whatAblity() {
ability.whatAblity();
System.out.println("會飛的能力");
}
}
class StrengePerson implements Ability {
private Ability ability;
public StrengePerson(Ability ability) {
this.ability = ability;
}
@Override
public void whatAblity() {
ability.whatAblity();
System.out.println("超級大力氣");
}
}
class ChangePerson implements Ability {
private Ability ability;
public ChangePerson(Ability ability) {
this.ability = ability;
}
@Override
public void whatAblity() {
ability.whatAblity();
System.out.println("會變身");
}
}
這裏我們是想裝飾一個人,讓他有能飛,能變身,還還有超級大力氣,這三種能力除了能一起,還能相互組合,繼承做這個很麻煩吧
public class Client {
public static void main(String[] args) {
Person person = new Person();
person.whatAblity();
System.out.println("##########################");
FlyPerson flyPerson = new FlyPerson(person);
flyPerson.whatAblity();
System.out.println("##########################");
ChangePerson changePerson = new ChangePerson(flyPerson);
changePerson.whatAblity();
System.out.println("##########################");
StrengePerson strengePerson = new StrengePerson(changePerson);
strengePerson.whatAblity();
}
}