裝飾設計模式就是對已有的對象的功能進行增強
簡單小例子:
class Person
{
void chifan()
{
System.out.println("chifan");
}
}
/*
為了不隨便改變原有的代碼。
還要增強chifan功能。
那麼就定義一個類,對原有對象進行裝飾。
by 何問起
*/
class NewPerson
{
private Person p;
NewPerson(Person p)
{
this.p = p;
}
public void newChifan()
{
System.out.println("來一杯");
p.chifan();
System.out.println("來一根");
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
//NewPerson np = new NewPerson(p);
//np.newChifan();
p.chifan();
}
}
// hovertree.com
我們考慮一下使用繼承也可以對父類中的功能進行增強只需要調用super就可以調用父類的方法,那使用裝飾和繼承有什麼區別?
使用繼承體系就會有點臃腫,因為當平房想要改成歐式時,還要建立子類。
Writer
|--FileWriter
|--BufferedFileWriter。
|--DataWriter
|--BufferedDataWriter。
|--MediaWriter
|--BufferedMediaWriter.
優化:
可以將緩沖技術單獨抽取進行封裝。
要緩沖區誰將誰和緩沖相關聯即可。
這樣的設計的相對體系會變的簡單。
使用繼承帶來的局限性:
/*
房子:平房,樓房。
House
|--PingFang
|--LouFang
准備對房子進行裝修。
1,對平房進行田園風光式的打造。
2,對樓房進行歐式風格的打造。
可以用繼承的方式來完成。
House
|--PingFang
|--TianYuanPingFang
|--LouFang
|--OuShiLouFang
該體系就有點臃腫,因為當平房想要改成歐式時,還要建立子類。
何問起
hovertree.com
*/
abstract class House
{
abstract void show();
}
class PingFang extends House
{
public void show()
{
System.out.println("平房");
}
}
class TianYuanPingFang extends PingFang
{
public void showTianYuan()
{
super.show();
System.out.println("田園風格");
}
}
class LouFang extends House
{
public void show()
{
System.out.println("樓房");
}
}
class OuShiLouFang extends LouFang
{
public void showOuShi()
{
super.show();
System.out.println("歐式風格");
}
}
class HouseDemo
{
public static void main(String[] args)
{
PingFang p = new PingFang();
///p.show();
TianYuanPingFang t = new TianYuanPingFang();
t.showTianYuan();
LouFang l = new LouFang();
//l.show();
OuShiLouFang o = new OuShiLouFang();
o.showOuShi();
}
}
使用裝飾設計模式進行裝飾:
/*
原體系:
House
|--PingFang
|--LouFang
無論將平房打造成田園還是歐式,都是對平房一種裝修。
而該裝修也可以用樓房。
by 何問起
hovertree.com
將現將該裝修定義好,需要把什麼房子進行改裝修,傳入即可。
House
|--PingFang
|--LouFang
|--TianYuan
|--OuShi
*/
abstract class House
{
abstract void show();
}
class PingFang extends House
{
public void show()
{
System.out.println("平房");
}
}
class LouFang extends House
{
public void show()
{
System.out.println("樓房");
}
}
class TianYuan extends House
{
private House h;
TianYuan(House h)
{
this.h = h;
}
public void show()
{
System.out.println("田園風格");
}
public void showTianYuan()
{
h.show();
this.show();
}
}
class OuShi extends House
{
private House h;
OuShi(House h)
{
this.h = h;
}
public void show()
{
System.out.println("歐式風格");
}
public void showOuShi()
{
h.show();
this.show();
}
}
class HouseDemo2
{
public static void main(String[] args)
{
PingFang p = new PingFang();
LouFang l = new LouFang();
OuShi o = new OuShi(new TianYuan(p));
o.showOuShi();
//TianYuan t = new TianYuan(l);
//t.showTianYuan();
//OuShi o = new OuShi(l);
//o.showOuShi();
}
}