定义
动静的给一个对象增加一些额定的职责。就减少性能来说,装璜模式比生成子类更加灵便。
在不用扭转原类文件和应用继承的状况下,动静地扩大一个对象的性能。
装璜者与被装璜者领有独特的超类,继承的目标是继承类型,而不是行为
装璜模式中,必然有一个最根本、最外围、最原始的接口或抽象类充当 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 大厂面试题精讲视频】