Java设计模式---装饰模式(Decorator)

1.  装饰模式(Decorator Pattern)定义:

     动态地给一个对象添加额外的职责(功能)。相比生成子类,装饰模式更加灵活。

2.  装饰模式中的角色说明:

     Component抽象角色: Component是一个接口或者抽象类,是我们最原始的对象

     ConcreteCompont具体角色: ConcreteCompont是继承或者实现了Component的类,也是我们需要装饰的类

     Decorator抽象装饰角色:抽象装饰者类,继承或者实现了Component,并且有一个私有的Component对象

     DecoratorOne具体装饰角色:继承了Decorator,一般在这个类为原始对象扩展功能

3.  实现示例代码:

 Component接口: 

public interface Component {
    
	public void operator();
	
}
ConcreteCompont类:

public class ConcreteComponent implements Component {

	@Override
	public void operator() {
		
		System.out.println("我是需要被装饰的操作方法....");

	}

}
抽象装饰者Decorator类:

public abstract class Decorator implements Component{
    
	private Component component;
	
	//通过构造函数传递被装饰者
	public Decorator(Component component) {
		super();
		this.component = component;
	}
	
	@Override
	public void operator() {
		this.component.operator();	
	}
	 
}
具体装饰者类:

public class DecoratorOne extends Decorator {
    
	//定义被装饰者
	public DecoratorOne(Component component) {
		super(component);
	}
	
	//重写父类的操作方法 
    @Override
    public void operator() {
    	this.decorator_one();
    	super.operator();
    }
    
    //定义装饰方法
    private void  decorator_one(){
    	System.out.println("来自一号装饰者的装饰处理");
    }

}
public class DecoratorTwo extends Decorator {
    
	//定义被装饰者
	public DecoratorTwo(Component component) {
		super(component);
	}
	
	//重写父类的操作方法 
    @Override
    public void operator() {
    	super.operator();
    	this.decorator_two();
    }
    
    //定义装饰方法
    private void  decorator_two(){
    	System.out.println("来自二号装饰者的装饰处理");
    }

}
装饰测试类:

public class Test {
   
	public static void main(String[] args) {
		
		 Component component=new ConcreteComponent();
		 //第一次装饰
		 component=new DecoratorOne(component);
		 //第二次装饰
		 component=new DecoratorTwo(component);
		 //装饰之后调用
		 component.operator();
		
	}
}
输出结果:

来自一号装饰者的装饰
我是需要被装饰的操作方法....
来自二号装饰者的装饰
4.  装饰模式的使用场景

   1.需要扩展一个类的功能或者给一个类增加附加功能

   2.需要动态的为一个对象增加功能,这些功能可以动态的撤销







原文地址:https://www.cnblogs.com/elgin-seth/p/5293768.html