適配器模式:將一個現(xiàn)有類實現(xiàn)的功能接口轉變?yōu)榭蛻粝M慕涌?/span>
場景:你想使用一個已經(jīng)存在的類,但是這個類的接口不符合需求,所以需要適配
有2中實現(xiàn):一種是繼承,一種是委托,先來看看繼承
第一步:系統(tǒng)現(xiàn)有功能
package com.google.desginpattern.adapter;
/**
* 現(xiàn)有系統(tǒng)提供的功能
*
* @author Administrator
*
*/
public class BMWCar {
public void quickDriver() {
System.out.println("寶馬太快");
}
}
第二步:客戶需要的接口
package com.google.desginpattern.adapter;
/**
* 客戶需要的接口
* @author Administrator
*
*/
public interface Car {
public void driver();
public void brake();
}
第三步:實現(xiàn)客戶需要的功能
package com.google.desginpattern.adapter;
/**
* 匹配客戶需求的實現(xiàn)
* @author Administrator
*
*/
public class CarAdapter extends BMWCar implements Car {
@Override
public void brake() {
System.out.println("剎車");
}
@Override
public void driver() {
quickDriver();
}
}
測試類:
package com.google.desginpattern.adapter;



public class Test
{


public static void main(String[] args)
{


Car car = new CarAdapter();

car.brake();

car.driver();

}

}

輸出:
剎車
寶馬太快
如果是委托的方式,改寫adapter
package com.google.desginpattern.adapter;
/**
* 匹配客戶需求的實現(xiàn)
*
* @author Administrator
*
*/
public class CarAdapter implements Car {
private BMWCar car;
@Override
public void brake() {
System.out.println("剎車");
}
@Override
public void driver() {
car.quickDriver();
}
public BMWCar getCar() {
return car;
}
public void setCar(BMWCar car) {
this.car = car;
}
}
裝飾器:裝飾器模式主要用于系統(tǒng)擴張功能用,在系統(tǒng)原有的功能上,擴展出其他的功能,JDK中IO包用到很多,比如datainputstream之類,需要用其他流進行構造的上層類,符合面向對象設計的開閉原則
下面我來寫個例子:
首先,寫一個Car模版,定義基本屬性及行為功能driver
package com.google.desginpattern.decoration;
//其實這是個模版
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)中這個類能提供的功能
package com.google.desginpattern.decoration;
//目前系統(tǒng)中此類的功能
public class BMWCar extends Car {
@Override
public void driver() {
System.out.println("我開著寶馬車");
}
}
現(xiàn)在我想在這個類上擴展出其他功能,比如:泡妞
第三步:定義一個裝飾模板,為什么給他定義個模板呢~因為可以給這個BMWCar類裝飾很不同的功能,不只泡妞一個~
繼承Car父類,覆蓋driver功能,調用Car引用完成driver功能
package com.google.desginpattern.decoration;
//裝飾器父類
public abstract class DecorationCar extends Car {
// 引入car
private Car car;
@Override
public void driver() {
car.driver();// 調用此car來完成裝飾器的功能
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
第四步:具體的裝飾功能,添加一個構造函數(shù),參數(shù)為Car,為裝飾父類Car引用賦值,其實就是原來具體的功能類,回想下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();// 調用原來的功能
System.out.println("泡妞");// 添加額外的功能
}
}
測試類:構造的方法很像IO包里的流
package com.google.desginpattern.decoration;
public class Test {
public static void main(String[] args) {
Car car = new DecorationBMWCar(new BMWCar());
car.driver();
}
}
輸出:
我開著寶馬車
泡妞
摘要: 觀察IOC中容器初始化某個Bean順序,現(xiàn)先一個JAVABean類,看看控制臺輸出:package com.google.aop.exception.ioc;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory...
閱讀全文