Android之装饰者模式

在查看ContextWrapper源码时,发现以下用法:

Android之装饰者模式_第1张图片

这种写法叫装饰者模式,相比于单纯的实现接口,它具备更大的灵活性。

// 抽象类接口,规范饼的属性
public interface ICake {
  public String name(); // 名称
  public Double money(); // 价格
}

// 原味手抓饼类
public class PlainCake implements ICake {
  
  @Override
  public String name() {
    return "原味手抓饼";
  }
  @Override
  public Double money() {
    return 3.5;
  }
}

// 装饰者(Decorator)
// 建立和原味饼的连接,得到原始饼属性的同时,又不改动原对象。
public abstract class Deractor implements ICake {
  ICake iCake;

  public Deractor(ICake iCake) {
    this.iCake = iCake;
  }

  @Override
  public String name() {
    return iCake.name(); 
  }

  @Override
  public Double money(){
    return iCake.money();
  }
}


// 鸡蛋手抓饼
public class EggCake extends Deractor {

  public EggCake(ICake cake) {
    super(cake);
  }

  @Override
  public String name() {
    return "鸡蛋" + cake.name(); // 重写父类方法,重新自定义属性
  }

  @Override
  public Double money() {
    return 3.5 + 1.5; // 重写父类方法,重新自定义属性
  }
}

// 牛肉味手抓饼
public class BeffCake extends Deractor {

  public BeffCake(ICake cake) {
    super(cake);
  }

  @Override
  public String name() {
    return "牛肉" + cake.name(); // 重写父类方法,重新自定义属性,下同
  }

  @Override
  public Double money() {
    return cake.money() + 3.0; // 重写父类方法,重新自定义属性,下同
  }
}

测试类
public class Test {
  public static void main(String[] args) {

    //原味,手抓饼类
    plaincake plain = new plaincake();
    System.out.println(sh.name() + "  价格: " + plain.money());

    //鸡蛋,加“鸡蛋” 到手抓饼上
    EggCake egg = new EggCake(plain);
    System.out.println(egg.name() + "  价格:" + egg.money());

    //牛肉,加“牛肉” 到鸡蛋饼上
    BeffCake beff = new BeffCake(egg);
    System.out.println(beff.name() + "  价格:" + beff.money());
  }
}

输出的结果:
原味手抓饼  价格: 3.5
鸡蛋原味手抓饼  价格:5.0
牛肉鸡蛋原味手抓饼  价格:8.0

可以看到:
手抓饼在原来属性没有被改动的情况下,我们根据Decrator 抽象类,可以随意扩展创建不同口味、价格的饼。

 

 

 

 

你可能感兴趣的:(Android,架构/框架)