装饰模式能给一个对象动态添加一些额外的职责。就增加功能来说, Decorator 模式相比生成子类更为灵活。
在装饰模式中各个角色有:
例子:
我们再从代码层面看一个例子:
使用装饰模式前
package DecoratorPattern.Before;
/**
* 使用装饰模式前
*/
class A {
public void doIt(){
System.out.print(‘A‘);
}
}
class AwithX extends A {
@Override
public void doIt() {
super.doIt();
doX();
}
private void doX(){
System.out.print(‘X‘);
}
}
class AwithY extends A {
@Override
public void doIt() {
super.doIt();
doY();
}
public void doY(){
System.out.print(‘Y‘);
}
}
class AwithZ extends A {
@Override
public void doIt() {
super.doIt();
doZ();
}
public void doZ() {
System.out.print(‘Z‘);
}
}
class AwithXY extends AwithX {
private AwithY obj = new AwithY();
@Override
public void doIt() {
super.doIt();
obj.doY();
}
}
class AwithXYZ extends AwithX {
private AwithY obj1 = new AwithY();
private AwithZ obj2 = new AwithZ();
@Override
public void doIt() {
super.doIt();
obj1.doY();
obj2.doZ();
}
}
public class DecoratorDemo{
public static void main(String[] args) {
A[] array = {new AwithX(), new AwithXY(), new AwithXYZ()};
for (A a: array){
a.doIt();
System.out.print(‘ ‘);
}
}
}
使用装饰模式后
package DecoratorPattern.After;
/**
* 使用装饰模式后
*/
interface I {
void doIt();
}
class A implements I {
@Override
public void doIt() {
System.out.print(‘A‘);
}
}
abstract class D implements I {
private I core;
public D(I inner) {
core = inner;
}
@Override
public void doIt() {
core.doIt();
}
}
class X extends D {
public X(I inner) {
super(inner);
}
@Override
public void doIt() {
super.doIt();
doX();
}
private void doX() {
System.out.print(‘X‘);
}
}
class Y extends D {
public Y(I inner) {
super(inner);
}
@Override
public void doIt() {
super.doIt();
doY();
}
private void doY() {
System.out.print(‘Y‘);
}
}
class Z extends D {
public Z(I inner) {
super(inner);
}
@Override
public void doIt() {
super.doIt();
doZ();
}
private void doZ() {
System.out.print(‘Z‘);
}
}
public class DecoratorDemo {
public static void main(String[] args) {
I[] array = {new X(new A()), new Y(new X(new A())), new Z(new Y(new X(new A())))};
for (I anArray: array){
anArray.doIt();
System.out.print(‘ ‘);
}
}
}
优点:
缺点:
参考:
https://sourcemaking.com/design_patterns/decorator
原文:https://www.cnblogs.com/flythinking/p/13703168.html