Java学习笔记(六):装饰、观察者模式及监听器

装饰模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。(百度百科)

例子:一个文件,导出本身的代码(BufferedReaderDemo),但是导出发现需要添加一个添加行号功能,用(LinenumberBufferedDemo)继承被包装的类,定义变量,引用被包装的类,定义构造方法,传入被包装类的实例,覆盖要改变的方法。在原BufferedReaderDemo中创建的对象,利用LinenumberBufferedDemo进行包装即可。

BufferedReaderDemo.java

1 package com.itheima.base; 2 3 import java.io.BufferedReader; 4 import java.io.FileReader; 5 import java.io.Reader; 6 7 public class BufferedReaderDemo { 8 9 public static void main(String[] args) throws Exception { 10 Reader r = new FileReader(“src/com/itheima/base/BufferedReaderDemo.java”); 11 BufferedReader br = new BufferedReader(r); 12 LinenumberBufferedReader lbr = new LinenumberBufferedReader(br); 13 String data = null; 14 while((data = lbr.readLine())!=null){ 15 System.out.println(data); 16 } 17 br.close(); 18 } 19 20 }

LinenumberBufferedDemo.java

1 package com.itheima.base; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 6 /* 7 1、编写一个类,继承被包装类。 8 2、定义变量,引用被包装类 9 3、定义构造方法,传入被包装类的实例 10 4、覆盖要改变的方法 11 */ 12 public class LinenumberBufferedReader extends BufferedReader{ 13 // private BufferedReader br; 14 // private int num = 1; 15 // public LinenumberBufferedReader(BufferedReader br){ 16 // super(br); 17 // this.br = br; 18 // } 19 // public String readLine() throws IOException { 20 // String data = br.readLine(); 21 // if(data==null){ 22 // return null; 23 // } 24 // return num+++”:”+data; 25 // } 26 private int num = 1; 27 public LinenumberBufferedReader(BufferedReader br){ 28 super(br); 29 } 30 public String readLine() throws IOException { 31 String data = super.readLine(); 32 if(data==null){ 33 return null; 34 } 35 return num+++”:”+data; 36 } 37 }


  • 观察者模式(监听器) Frame:触发事件的对象。事件源 WindowListener:监听器。定义了一些方法,对应触发的事件。 WindowEvent:事件对象。封装事件源。

1 package com.itheima.base; 2 3 import java.awt.Frame; 4 import java.awt.event.WindowAdapter; 5 import java.awt.event.WindowEvent; 6 7 public class FrameDemo { 8 9 public static void main(String[] args) { 10 Frame f = new Frame(“我的小窗户”); 11 f.setSize(600, 400); 12 f.addWindowListener(new MyWindowListener()); 13 f.setVisible(true); 14 } 15 } 16 class MyWindowListener extends WindowAdapter{ 17 public void windowClosing(WindowEvent e) { 18 //得到发生事件的那个对象 19 Frame f = (Frame)e.getSource(); 20 f.dispose(); 21 } 22 }

  • Servlet规范中的8个监听器

1、监听ServletContext、HttpSession、ServletRequest对象的创建和销毁的监听器 ServletContextListener: HttpSessionListener: SerlvetRequestListener: 2、监听ServletContext、HttpSession、ServletRequest属性(attributes)变化的监听器 ServletContextAttributeListener: HttpSessionAttributeListener: SerlvetRequestAttributeListener: 注意:监听器要注册到事件对象上。web.xml中注册 3、感知型监听器:不需要注册。 HttpSessionBindingListener:实现该接口的类的实例,能够感知自己何时被放到了HttpSession域范围中,和何时从HttpSession域范围中删除。 HttpSessionActivationListener:实现该接口的类的实例,能够感知自己何时随着HttpSession钝化和激活。




    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • What is Mathematics: Solution Chapter 3
  • What is Mathematics: Solution Chapter 2
  • What is Mathematics: Solution Chapter 1
  • A small guide to supplements: What you need to know
  • 混乱与秩序