假設(shè)我們項(xiàng)目中已經(jīng)有了一個(gè)類(lèi)
public abstract class Car {
public abstract void setFeature();
}
而且這個(gè)類(lèi)有四個(gè)實(shí)現(xiàn)類(lèi):
public class AudiCar extends Car {
@Override
public void setFeature() {
System.out.println("奧迪四個(gè)環(huán)");
}
}
public class BMWCar extends Car {
@Override
public void setFeature() {
System.out.println("寶馬別摸我");
}
}
public class Benz extends Car {
@Override
public void setFeature() {
System.out.println("奔馳三個(gè)尖");
}
}
public class TrucksCar extends Car {
@Override
public void setFeature() {
System.out.println("大貨車(chē)個(gè)頭很大");
}
}
突然有一天,我們的需求變了,我們需要給這個(gè)Car增加自動(dòng)泊車(chē)功能,怎么辦?
思路一:我們可以在Car這個(gè)類(lèi)里面增加一個(gè)抽象方法,比如:
public abstract class Car {
public abstract void setFeature();
//新增自動(dòng)泊車(chē)功能
public abstract void autoPark();
}
這樣的話(huà),它的四個(gè)實(shí)現(xiàn)類(lèi)都要實(shí)現(xiàn)這個(gè)自動(dòng)泊車(chē)的方法:
public class AudiCar extends Car {
@Override
public void setFeature() {
System.out.println("奧迪四個(gè)環(huán)");
}
@Override
public void autoPark() {
System.out.println("全自動(dòng)泊車(chē)");
}
}
public class Benz extends Car {
@Override
public void setFeature() {
System.out.println("奔馳三個(gè)尖");
}
@Override
public void autoPark() {
System.out.println("全自動(dòng)泊車(chē)");
}
}
public class BMWCar extends Car {
@Override
public void setFeature() {
System.out.println("寶馬別摸我");
}
@Override
public void autoPark() {
System.out.println("全自動(dòng)泊車(chē)");
}
}
public class TrucksCar extends Car {
@Override
public void setFeature() {
System.out.println("大貨車(chē)個(gè)頭很大");
}
@Override
public void autoPark() {
System.out.println("半自動(dòng)泊車(chē),請(qǐng)注意倒車(chē)");
}
}
這樣的話(huà),我們實(shí)現(xiàn)了需求,但是這樣的話(huà),稍微麻煩,因?yàn)锳udiCar, Benz, BMWCar這三個(gè)類(lèi)實(shí)現(xiàn)自動(dòng)泊車(chē)的功能是一樣的,我們完全沒(méi)有必要這三個(gè)類(lèi)都去重寫(xiě).
這個(gè)時(shí)候,策略模式出來(lái)了!
思路二:我們把新增的功能抽象出接口:
public interface IAutoPark {
void autoPark();
}
因?yàn)槟壳靶枨筮@個(gè)功能有兩種具體的實(shí)現(xiàn),一個(gè)"全自動(dòng)泊車(chē)",一個(gè)"半自動(dòng)泊車(chē),請(qǐng)注意倒車(chē)",所以我們定義兩個(gè)實(shí)現(xiàn)類(lèi):
public class AutoParkImp implements IAutoPark {
@Override
public void autoPark() {
System.out.println("全自動(dòng)泊車(chē)");
}
}
public class HalfAutoParkImp implements IAutoPark {
@Override
public void autoPark() {
System.out.println("半自動(dòng)泊車(chē),請(qǐng)注意倒車(chē)");
}
}
然后修改Car:
public abstract class Car {
protected IAutoPark autoPark;
//它的子類(lèi)在初始化的時(shí)候要傳入自己自動(dòng)泊車(chē)功能的具體實(shí)現(xiàn)
public Car(IAutoPark autoPark){
this.autoPark = autoPark;
}
public abstract void setFeature();
//新增自動(dòng)泊車(chē)功能
public void autoPark(){
autoPark.autoPark();
}
}
四個(gè)子類(lèi)的實(shí)現(xiàn):
public class AudiCar extends Car {
public AudiCar(IAutoPark autoPark) {
super(autoPark);
}
@Override
public void setFeature() {
System.out.println("奧迪四個(gè)環(huán)");
}
}
public class Benz extends Car {
public Benz(IAutoPark autoPark) {
super(autoPark);
}
@Override
public void setFeature() {
System.out.println("奔馳三個(gè)尖");
}
}
public class BMWCar extends Car {
public BMWCar(IAutoPark autoPark) {
super(autoPark);
}
@Override
public void setFeature() {
System.out.println("寶馬別摸我");
}
}
public class TrucksCar extends Car {
public TrucksCar(IAutoPark autoPark) {
super(autoPark);
}
@Override
public void setFeature() {
System.out.println("大貨車(chē)個(gè)頭很大");
}
}
我們?cè)谑褂玫臅r(shí)候:
Car audi = new AudiCar(new AutoParkImp());
audi.setFeature();
audi.autoPark();
Car trucks = new TrucksCar(new HalfAutoParkImp());
trucks.setFeature();
trucks.autoPark();
日志打印:
System.out: 奧迪四個(gè)環(huán)
System.out: 全自動(dòng)泊車(chē)
System.out: 大貨車(chē)個(gè)頭很大
System.out: 半自動(dòng)泊車(chē),請(qǐng)注意倒車(chē)
所謂的設(shè)計(jì)模式就是大家總結(jié)出來(lái)的套路,使用的時(shí)候還是要根據(jù)自己項(xiàng)目中的需求來(lái)選擇,不要為了使用而使用