一,什麼是裝飾模式
裝飾(Decorator)模式又叫做包裝模式。通過一種對客戶端透明的方式來擴展對象的功能,是繼承關係的替換方案。
二,裝飾類的結構
三,裝飾模式的角色和職責,缺點和優點。
抽象組件角色: 一個抽象接口,是被裝飾類和裝飾類的父接口。
具體組件角色:爲抽象組件的實現類。
抽象裝飾角色: 包含一個組件的引用,並定義了與抽象組件一致的接口
具體裝飾角色:爲抽象裝飾角色的實現類。負責具體的裝飾。
優點:
- Decorator模式與繼承關係的目的都是要擴展對象的功能,但是Decorator可以提供比繼承更多的靈活性。
- 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行爲的組合。
缺點:
- 這種比繼承更加靈活機動的特性,也同時意味着更加多的複雜性。
- 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程序變得很複雜。
- 裝飾模式是針對抽象組件(Component)類型編程。但是,如果你要針對具體組件編程時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變Component接口,增加新的公開的行爲,實現“半透明”的裝飾者模式。在實際項目中要做出最佳選擇。
注意: java IO流的操作就是典型的裝飾模式。
四,代碼實現
4.1 抽象組件角色: 一個抽象接口,是被裝飾類和裝飾類的父接口。
/**
* @ClassName Person
* @Description 一個抽象接口,是被裝飾類和裝飾類的父接口。
* @Version 1.0
**/
public interface Person {
public void desc();
}
4.2 具體組件角色:爲抽象組件的實現類。
/**
* @ClassName Woman
* @Description 具體組件角色:爲抽象組件的實現類。
* @Version 1.0
**/
public class Woman implements Person{
@Override
public void desc() {
System.out.println("這是一個女人");
}
}
4.3,抽象裝飾角色: 包含一個組件的引用,並定義了與抽象組件一致的接口
/**
* @ClassName PersonDecorator
* @Description 抽象裝飾角色: 包含一個組件的引用,並定義了與抽象組件一致的接口
* @Version 1.0
**/
public abstract class PersonDecorator implements Person {
private Person person;
public PersonDecorator(Person person) {
this.person = person;
}
@Override
public abstract void desc();
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
4.4,爲抽象裝飾角色的實現類。負責具體的裝飾。
/**
* @ClassName skirtPerson
* @Description 爲抽象裝飾角色的實現類。負責具體的裝飾。
* @Version 1.0
**/
public class SkirtPerson extends PersonDecorator {
public SkirtPerson(Person person) {
super(person);
}
@Override
public void desc() {
super.getPerson().desc();
this.skirt();
}
public void skirt(){
System.out.println("穿裙子的女人");
}
}
4.5 測試