Android之装饰者模式
16lz
2021-01-25
在查看ContextWrapper源码时,发现以下用法:
这种写法叫装饰者模式,相比于单纯的实现接口,它具备更大的灵活性。
// 抽象类接口,规范饼的属性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 抽象类,可以随意扩展创建不同口味、价格的饼。
更多相关文章
- SystemUI下的RecentActivity
- Andorid中xml资料汇总
- Android中GridView的一些特殊属性
- Android(安卓)Vector(Vector/Vector动画)
- Android(安卓)ORM-GreenDao学习之一基础篇
- Android自定义View
- 个人经验 - Android的RelativeLayout布局的layout_height属性设
- 彻底理解Android沉浸状态栏适配
- Android(安卓)中View只能接收到ACTION_DOWN无法接收ACTION_MOVE