装饰者模式
/**
* 被装饰抽象类
*/
public abstract class Component {
//抽象方法
public abstract void operate();
}
/**
* 具体构件(被装饰者)
*/
public class ConcreteComponent extends Component {
@Override
public void operate() {
System.out.println("do something");
}
}
//装饰接口
public class Decorator extends Component{
private Component component=null;
//注入被装饰者
public Decorator(Component component) {
this.component = component;
}
//委托装饰者调用
@Override
public void operate() {
this.component.operate();
}
}
//装饰封装1
public class ConcreteDecorator1 extends Decorator{
public ConcreteDecorator1(Component component) {
super(component);
}
private void Method1(){
System.out.println("我是修饰方法一");
}
@Override
public void operate() {
this.Method1();
super.operate();
}
}
//装饰封装2
public class ConcreteDecorator2 extends Decorator{
public ConcreteDecorator2(Component component) {
super(component);
}
private void Method2(){
System.out.println("我是修饰方法二");
}
@Override
public void operate() {
this.Method2();
super.operate();
}
}
public class Test {
public static void main(String[] args) {
//被装饰者地址
Component component = new ConcreteComponent();
//被装饰者地址作为构造器字段传入实列化
component= new ConcreteDecorator1(component);
//已经被赋予构造器字段传入实例化有点类似链式结构ConcreteDecorator2(ConcreteDecorator1(ConcreteComponent))
component= new ConcreteDecorator2(component);
component.operate();
}
}
结果:
我是修饰方法二
我是修饰方法一
do something