裝飾器
裝飾器:裝飾器模式主要用于系統(tǒng)擴(kuò)張功能用,在系統(tǒng)原有的功能上,擴(kuò)展出其他的功能,JDK中IO包用到很多,比如datainputstream之類,需要用其他流進(jìn)行構(gòu)造的上層類,符合面向?qū)ο笤O(shè)計(jì)的開閉原則
下面我來寫個(gè)例子:
首先,寫一個(gè)Car模版,定義基本屬性及行為功能driver
package com.google.desginpattern.decoration;
//其實(shí)這是個(gè)模版
public abstract class Car {
private int spreed;
public int getSpreed() {
return spreed;
}
public void setSpreed(int spreed) {
this.spreed = spreed;
}
public abstract void driver();
}
//其實(shí)這是個(gè)模版
public abstract class Car {
private int spreed;
public int getSpreed() {
return spreed;
}
public void setSpreed(int spreed) {
this.spreed = spreed;
}
public abstract void driver();
}
第二步:具體車比如寶馬,這是目前系統(tǒng)中這個(gè)類能提供的功能
package com.google.desginpattern.decoration;
//目前系統(tǒng)中此類的功能
public class BMWCar extends Car {
@Override
public void driver() {
System.out.println("我開著寶馬車");
}
}
//目前系統(tǒng)中此類的功能
public class BMWCar extends Car {
@Override
public void driver() {
System.out.println("我開著寶馬車");
}
}
現(xiàn)在我想在這個(gè)類上擴(kuò)展出其他功能,比如:泡妞
第三步:定義一個(gè)裝飾模板,為什么給他定義個(gè)模板呢~因?yàn)榭梢越o這個(gè)BMWCar類裝飾很不同的功能,不只泡妞一個(gè)~
繼承Car父類,覆蓋driver功能,調(diào)用Car引用完成driver功能
package com.google.desginpattern.decoration;
//裝飾器父類
public abstract class DecorationCar extends Car {
// 引入car
private Car car;
@Override
public void driver() {
car.driver();// 調(diào)用此car來完成裝飾器的功能
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
//裝飾器父類
public abstract class DecorationCar extends Car {
// 引入car
private Car car;
@Override
public void driver() {
car.driver();// 調(diào)用此car來完成裝飾器的功能
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
第四步:具體的裝飾功能,添加一個(gè)構(gòu)造函數(shù),參數(shù)為Car,為裝飾父類Car引用賦值,其實(shí)就是原來具體的功能類,回想下IO包里經(jīng)常new的代碼段就明白~~
package com.google.desginpattern.decoration;
//具體的裝飾類,添加額外的泡妞功能
public class DecorationBMWCar extends DecorationCar {
public DecorationBMWCar(Car car) {
super.setCar(car);
}
@Override
public void driver() {
// TODO Auto-generated method stub
super.driver();// 調(diào)用原來的功能
System.out.println("泡妞");// 添加額外的功能
}
}
//具體的裝飾類,添加額外的泡妞功能
public class DecorationBMWCar extends DecorationCar {
public DecorationBMWCar(Car car) {
super.setCar(car);
}
@Override
public void driver() {
// TODO Auto-generated method stub
super.driver();// 調(diào)用原來的功能
System.out.println("泡妞");// 添加額外的功能
}
}
測(cè)試類:構(gòu)造的方法很像IO包里的流
package com.google.desginpattern.decoration;
public class Test {
public static void main(String[] args) {
Car car = new DecorationBMWCar(new BMWCar());
car.driver();
}
}
public class Test {
public static void main(String[] args) {
Car car = new DecorationBMWCar(new BMWCar());
car.driver();
}
}
輸出:
我開著寶馬車
泡妞
posted on 2010-11-29 21:36 羔羊 閱讀(197) 評(píng)論(0) 編輯 收藏 所屬分類: desginpattern