【05】结构型-装饰者Decorator模式

一、上下文及问题

      开放封闭原则:Open-Closed Principle,对于已有的类,只能修改其错误,若是扩展功能,不能直接修改它们,而是通过新添加类来解决。

     修饰者模式就是新添加类来扩展功能的一种方法。

     与代理模式在结构上很像,但是区别是:代理模式仅仅是代理(当然做些权限、日志等业务不相关操作),而装饰者模式则扩展了额外功能(比如过滤特殊字符、增强原有方法的功能)。


二、常见场景

(1)增加操作日志

(2)web文本输入过滤特殊字符

(3)AOP可以采用Decorator的方法实现,更为精准,动态AOP的拦截不如Decorator直接指定的快


三、解决方法

(1)Decorator模式

(2)AOP拦截


四、抽象模型

【05】结构型-装饰者Decorator模式

  Component也可以是接口形式


五、代码实例 

1、java的io扩展实例

package headfirst.decorator.io;

import java.io.*;

public class LowerCaseInputStream extends FilterInputStream {

	public LowerCaseInputStream(InputStream in) {
		super(in);
	}
 
	public int read() throws IOException {
		int c = super.read();
		return (c == -1 ? c : Character.toLowerCase((char)c));
	}
		
	public int read(byte[] b, int offset, int len) throws IOException {
		int result = super.read(b, offset, len);
		for (int i = offset; i < offset+result; i++) {
			b[i] = (byte)Character.toLowerCase((char)b[i]);
		}
		return result;
	}
}

   测试  

public class InputTest {
	public static void main(String[] args) throws IOException {
		int c;

		try {
			InputStream in = 
				new LowerCaseInputStream(
					new BufferedInputStream(
						new FileInputStream("test.txt")));

			while((c = in.read()) >= 0) {
				System.out.print((char)c);
			}

			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


2、类图实例

public interface Work
{ 
  public void insert();
}

public class SquarePeg implements Work{
  public void insert(){
    System.out.println("方形桩插入");
  }
}

public class Decorator implements Work{
  private Work work;
  //额外增加的功能被打包在这个List中
  private ArrayList others = new ArrayList();
  //在构造器中使用组合new方式,引入Work对象;
  public Decorator(Work work)
  {
    this.work=work;
   
    others.add("挖坑");
    others.add("钉木板");
  }
  public void insert(){
    newMethod();
  }
  
  //在新方法中,我们在insert之前增加其他方法,这里次序先后是用户灵活指定的    
  public void newMethod()
  {
    otherMethod();
    work.insert();
  } 
  public void otherMethod()
  {
    ListIterator listIterator = others.listIterator();
    while (listIterator.hasNext())
    {
      System.out.println(((String)(listIterator.next())) + " 正在进行");
    }

  } 
}

   使用

Work squarePeg = new SquarePeg(); 
Work decorator = new Decorator(squarePeg);
decorator.insert();


你可能感兴趣的:(【05】结构型-装饰者Decorator模式)