Java實現裝飾者模式
阿新 • • 發佈:2021-07-01
裝飾者模式(Decorator或Wrapper)
被裝飾者將擴充套件功能的任務委託給裝飾者,從而避免直接修改原來的類(開閉原則:對擴充套件開放,對修改關閉)
裝飾者與被裝飾者擁有同樣的超型別
裝飾者可以在被裝飾者的行為前或行為後,增加自己的行為
裝飾者模式說白了,就是在裝飾者類中持有超類物件,增強超類物件的功能,或者進行擴充套件(雖然極其簡單,但是很有用)。
Java io包中的包裝流就用到了裝飾者模式,用來擴充套件基礎流的功能。
裝飾者模式示例:
小白程式設計師一開始啥都不會
public class Coder { public double getSalary() { return 0; } public String getSkill() { return "啥也不會"; } }
私下琢磨了一天後,學會了HelloWorld(增強了超類功能,但沒有修改超類中的程式碼)
public class HelloWorldCoder extends Coder { private Coder coder; public HelloWorldCoder(Coder coder) { this.coder = coder; } @Override public double getSalary() { return coder.getSalary()+100; } @Override public String getSkill() { return coder.getSkill()+",會寫HelloWorld了"; } }
通過閱讀《Java從入門到精通》,小白終於精通了Java,順便學會了CRUD
public class JavaCoder extends Coder { private Coder coder; public JavaCoder(Coder coder) { this.coder = coder; } @Override public double getSalary() { return coder.getSalary()+1000; } @Override public String getSkill() { return coder.getSkill()+",精通Java"; } // 擴充套件功能 public void curd() { System.out.println("會寫增刪改查了"); } }
小白還在不停的學習新的技能...
測試
public static void main(String[] args)
{
Coder coder=new Coder();
System.out.println(coder.getSalary());
System.out.println(coder.getSkill());
Coder helloworldCoder=new HelloWorldCoder(coder);
System.out.println(helloworldCoder.getSalary());
System.out.println(helloworldCoder.getSkill());
Coder javaCoder=new JavaCoder(helloworldCoder);
System.out.println(javaCoder.getSalary());
System.out.println(javaCoder.getSkill());
// 使用擴充套件(裝飾類特有)的功能
JavaCoder crudCoder= (JavaCoder)javaCoder;
crudCoder.curd();
}
輸出
0.0
啥也不會
100.0
啥也不會,會寫HelloWorld了
1100.0
啥也不會,會寫HelloWorld了,精通Java
會寫增刪改查了