文章标题:转载:设计模式之装饰模式(Decorator)
文章链接:https://blog.csdn.net/elizabethxxy/article/details/118608823
代码:
package com.study.javastudy.designpattern.decorator;
public abstract class Component {
public abstract void operation();
}
-----
package com.study.javastudy.designpattern.decorator;
public class ConcreteComponent extends Component {
@Override
public void operation() {
System.out.println("in class ConcreteComponent, method operation");
System.out.println("具体对象的操作");
}
}
------
package com.study.javastudy.designpattern.decorator;
public abstract class Decorator extends Component {
private Component component = null;
//通过构造函数传递给被修饰者
public Decorator(Component component) {
System.out.println("in class Decorator constructor");
System.out.println("component: " + component);
System.out.println("this: " + this);
this.component = component;
}
//委托给被修饰者执行
@Override
public void operation() {
System.out.println("in class Decorator, method operation");
System.out.println("component: " + component);
System.out.println("this: " + this);
if(component != null) {
this.component.operation();
}
}
}
-------
package com.study.javastudy.designpattern.decorator;
public class ConcreteDecoratorA extends Decorator {
//定义被修饰者
public ConcreteDecoratorA(Component component) {
super(component);
System.out.println("in class ConcreteDecoratorA constructor");
System.out.println("component: " + component);
}
//定义自己的修饰方法
private void method1() {
System.out.println("in class ConcreteDecoratorA, method method1");
System.out.println("method1 修饰");
}
@Override
public void operation() {
System.out.println("in class ConcreteDecoratorA, method operation");
System.out.println("this: " + this);
// System.out.println("super: " + super);
this.method1();
System.out.println("AAAAAAAAAAA");
super.operation();
System.out.println("AAAAAAAAAAA");
}
}
---------
package com.study.javastudy.designpattern.decorator;
public class ConcreteDecoratorB extends Decorator {
//定义被修饰者
public ConcreteDecoratorB(Component component) {
super(component);
System.out.println("in class ConcreteDecoratorB constructor");
System.out.println("component: " + component);
}
//定义自己的修饰方法
private void method2() {
System.out.println("in class ConcreteDecoratorB, method method2");
System.out.println("method2 修饰");
}
@Override
public void operation() {
System.out.println("in class ConcreteDecoratorB, method operation");
System.out.println("this: " + this);
// System.out.println("super: " + super);
System.out.println("BBBBBBBBBBB");
super.operation();
// this.method2();
System.out.println("BBBBBBBBBBB");
this.method2();
// super.operation();
}
}
----------
package com.study.javastudy.designpattern.decorator;
public class Client {
public static void main(String[] args) {
Component component = new ConcreteComponent();
System.out.println("component: " + component); // com.study.javastudy.designpattern.decorator.ConcreteComponent@4554617c
System.out.println("===========");
//第一次修饰
component = new ConcreteDecoratorA(component);
System.out.println("component: " + component); // com.study.javastudy.designpattern.decorator.ConcreteDecoratorA@74a14482
System.out.println("===========");
//第二次修饰
component = new ConcreteDecoratorB(component);
System.out.println("component: " + component); // com.study.javastudy.designpattern.decorator.ConcreteDecoratorB@1540e19d
System.out.println("===========");
//修饰后运行
component.operation();
}
}
/*
* (1)成员变量:编译看左边,运行看左边
* (2)成员方法:编译看左边,运行看右边
*/