定义:将抽象部分与实现部分分离,使它们都可以独立地进行变化。
使用场景:文字很难描述清楚,直接看例子。
一杯可以从杯子大小和是否加糖两个纬度变化。
public abstract class CoffeeAdditives {
/**
* 具体往咖啡里添加什么由子类实现
* @return
*/
public abstract String addSomething();
}
public abstract class Coffee {
protected CoffeeAdditives impl;
public Coffee(CoffeeAdditives impl) {
this.impl = impl;
}
/**
* 咖啡具体是什么样的由子类决定
*/
public abstract void makeCoffee();
}
public class LargeCoffee extends Coffee {
public LargeCoffee(CoffeeAdditives impl) {
super(impl);
}
@Override
public void makeCoffee() {
Log.e("大杯的"+impl.addSomething()+"咖啡");
}
}
public class SmallCoffee extends Coffee {
public SmallCoffee(CoffeeAdditives impl) {
super(impl);
}
@Override
public void makeCoffee() {
Log.e("小杯的"+impl.addSomething()+"咖啡");
}
}
public class Sugar extends CoffeeAdditives {
@Override
public String addSomething() {
return "加糖";
}
}
public class Ordinary extends CoffeeAdditives {
@Override
public String addSomething() {
return "原味";
}
}
public class Main {
public static void main(String[] args){
//原味
Ordinary implOrdinary=new Ordinary();
//加糖
Sugar implSugar=new Sugar();
//大杯原味
LargeCoffee largeCoffeeOrdinary=new LargeCoffee(implOrdinary);
largeCoffeeOrdinary.makeCoffee();
//小杯原味
SmallCoffee smallCoffeeOrdinary=new SmallCoffee(implOrdinary);
smallCoffeeOrdinary.makeCoffee();
//大杯加糖
LargeCoffee largeCoffeeSugar=new LargeCoffee(implSugar);
largeCoffeeSugar.makeCoffee();
//小杯加糖
SmallCoffee smallCoffeeSugar=new SmallCoffee(implSugar);
smallCoffeeSugar.makeCoffee();
}
}
运行结果:
大杯的原味咖啡
小杯的原味咖啡
大杯的加糖咖啡
小杯的加糖咖啡
如果此时咖啡厅为了满足更多人的习惯,推出中杯咖啡怎么办?
定义中杯类扩展Coffee类即可。
public class MiddleCoffee extends Coffee {
public MiddleCoffee(CoffeeAdditives impl) {
super(impl);
}
@Override
public void makeCoffee() {
Log.e("中杯的"+impl.addSomething()+"咖啡");
}
}