Android入门教程 | 装饰者模式

定义 动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更加灵活。
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。
【Android入门教程 | 装饰者模式】装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为

装饰模式中,必然有一个最基本、最核心、最原始的接口或抽象类充当Component 抽象构件。
装饰模式的通用结构
Component// 最基本的抽象构件,接口或抽象类 Operation() ConcreteComponent// 具体的构件 Decorator// 抽象的装饰者 ConcreteComponent// 具体的装饰者

优缺点和应用场景 优点:
  • 装饰类和被装饰类可以独立发展,不会耦合
  • 装饰模式是继承关系的一个替代方案
  • 装饰模式可以动态地扩展一个类(扩展性好)
缺点:多层的装饰是比较复杂的。
应用场景
主要场景就是能发挥优点的地方
  • 扩展一个类的功能,或给一个类增加附加功能
  • 动态地增加或撤销一个类的功能
  • 需要为一批兄弟类进行改装或加装功能
代码示例 worker 示例
AWorker 称为装饰者 Plumber 称为被装饰者
先定义一个 Plumber,接着将其传入 AWorker 中;这样得到的是 AWorker-Plumber Carpenter 同理。这里装饰者的方法中调用的是传入对象的类的方法。
/** * Decoration test */ public class Decoration {public static void main(String args[]) { Plumber plumber = new Plumber(); AWorker aWorker = new AWorker(plumber); aWorker.doSomeWork(); Carpenter carpenter = new Carpenter(); BWorker bCarpenter = new BWorker(carpenter); bCarpenter.doSomeWork(); } }interface Worker { void doSomeWork(); }class Plumber implements Worker { public void doSomeWork() { System.out.println("Plumber do some work!"); } }class Carpenter implements Worker { public void doSomeWork() { System.out.println("Carpenter do some work!"); } }class AWorker implements Worker { private Worker tempWorker; public AWorker(Worker worker) { tempWorker = worker; }public void doSomeWork() { System.out.println("Hello,I am a A worker"); tempWorker.doSomeWork(); // use the Worker class method } }// use temp Worker, avoid "this" class BWorker implements Worker { private Worker worker; public BWorker(Worker worker) { this.worker = worker; }public void doSomeWork() { System.out.println("Hello,I am a B worker"); worker.doSomeWork(); } }

输出:
Hello,I am a A worker Plumber do some work! Hello,I am a B worker Carpenter do some work!

【Android 零基础入门教程视频】
【Android 框架源码解析视频】
【Android 大厂面试题精讲视频】

    推荐阅读