Java实际应用中经常遇到的"装饰模式"总结
2016-12-16 09:18
288 查看
在java实际应用中,经常会遇到BufferedWriter FilterWriter = new BufferedWriter(newFileWriter("Filter.txt")); 类似的语句,尤其是在I/O操作类中,这种用新new的类包裹着旧new的类对象的形式很常见。这里用到的就是所谓的装饰模式。
理论上来说,一个类A的方法能力上包含或者使用了另一个类B的方法能力,这种情况一般只有两只种途径,一是继承,二是组合。
继承很好理解,class A extend B,那A中就继承了B的所有能力方法,并且能使用它们。
组合也容易理解,class A { B b;},那么A中就包含了B的对象b,调用b的方法可以被A利用。
这时,突然增加另一种模式,号称通过该模式也能实现用A类来使用B类的方法和能力,前提只有一个就是A类和B类有共同的父类,这就是所谓的装饰模式,举个最简单的装饰模式的例子:
public interface OBJ
{
public void fun1();
}
public class decorate implements OBJ
{
OBJ obj;
public decorate (OBJ obj){
this.obj= obj;
}
@Override
public void fun1() {
// TODO Auto-generated method stub
obj.fun1();
}
};
public class MyDecorate extends decorate
{
public MyDecorate(OBJ obj)
{
super(obj);
}
public void fun1(){
super.fun1();
System.out.println("MyDecorate. fun1()");
}
}
public class MyObj implements OBJ
{
public void fun1(){
System.out.println("MyObj. fun1()");
}
}
public class DecorateTest {
public static void main(String[] args) {
MyDecorate myDecorate=new MyDecorate(new MyObj());
myDecorate. fun1();
}
}
当在程序中执行下面语句时
MyDecorate myDecorate=new MyDecorate(new MyObj());
myDecorate. fun1();
执行结果:
MyObj. fun1()
MyDecorate. fun1()
也就是MyDecorate的对象执行了MyObj的fun1()能力,在执行完该能力后再执行自己的能力,但是跟前面的继承和组合不同,MyDecorate既不是继承了MyObj,也非成员包含了MyObj 的对象,但是却能调用MyObj的能力。这就是所谓的装饰模式,MyDecorate是装饰者,MyObj是被装饰者。整个调用过程如下:
1.MyDecorate myDecorate=new MyDecorate(new MyObj());的执行过程中调用MyDecorate的构造方法,构造方法中调用了Super(obj);也就是父类decorate的构造方法,并赋值给decorate类的对象成员This.
Obj= obj;
2.执行myDecorate. fun1();时,调用了MyDecorate.fun1();而在该方法里调用了Super.
fun1();
也就是父类decorate的fun1();,而父类的fun1()实现是Obj.
fun1();这个Obj实际指向的类型是MyObj而不是OBJ,所以先打印了MyObj.
fun1(),再打印了MyDecorate. fun1()
从上面流程可以看出所谓的装饰模式归根结底还是组合方式的变体,MyDecorate对象里面包含了从父类继承而来的OBJ
obj;引用,并结合多态性的动态类型绑定,最终调用了MyObj这个被修饰类的fun1()。使用这种隐秘的组合方式实现了装饰类调用被装饰类的能力方法。明白这个模式对于应用java还是非常重要的,因为经常会出现,了解了其调用流程就能从容应对这类代码语句,做到心中有数
理论上来说,一个类A的方法能力上包含或者使用了另一个类B的方法能力,这种情况一般只有两只种途径,一是继承,二是组合。
继承很好理解,class A extend B,那A中就继承了B的所有能力方法,并且能使用它们。
组合也容易理解,class A { B b;},那么A中就包含了B的对象b,调用b的方法可以被A利用。
这时,突然增加另一种模式,号称通过该模式也能实现用A类来使用B类的方法和能力,前提只有一个就是A类和B类有共同的父类,这就是所谓的装饰模式,举个最简单的装饰模式的例子:
public interface OBJ
{
public void fun1();
}
public class decorate implements OBJ
{
OBJ obj;
public decorate (OBJ obj){
this.obj= obj;
}
@Override
public void fun1() {
// TODO Auto-generated method stub
obj.fun1();
}
};
public class MyDecorate extends decorate
{
public MyDecorate(OBJ obj)
{
super(obj);
}
public void fun1(){
super.fun1();
System.out.println("MyDecorate. fun1()");
}
}
public class MyObj implements OBJ
{
public void fun1(){
System.out.println("MyObj. fun1()");
}
}
public class DecorateTest {
public static void main(String[] args) {
MyDecorate myDecorate=new MyDecorate(new MyObj());
myDecorate. fun1();
}
}
当在程序中执行下面语句时
MyDecorate myDecorate=new MyDecorate(new MyObj());
myDecorate. fun1();
执行结果:
MyObj. fun1()
MyDecorate. fun1()
也就是MyDecorate的对象执行了MyObj的fun1()能力,在执行完该能力后再执行自己的能力,但是跟前面的继承和组合不同,MyDecorate既不是继承了MyObj,也非成员包含了MyObj 的对象,但是却能调用MyObj的能力。这就是所谓的装饰模式,MyDecorate是装饰者,MyObj是被装饰者。整个调用过程如下:
1.MyDecorate myDecorate=new MyDecorate(new MyObj());的执行过程中调用MyDecorate的构造方法,构造方法中调用了Super(obj);也就是父类decorate的构造方法,并赋值给decorate类的对象成员This.
Obj= obj;
2.执行myDecorate. fun1();时,调用了MyDecorate.fun1();而在该方法里调用了Super.
fun1();
也就是父类decorate的fun1();,而父类的fun1()实现是Obj.
fun1();这个Obj实际指向的类型是MyObj而不是OBJ,所以先打印了MyObj.
fun1(),再打印了MyDecorate. fun1()
从上面流程可以看出所谓的装饰模式归根结底还是组合方式的变体,MyDecorate对象里面包含了从父类继承而来的OBJ
obj;引用,并结合多态性的动态类型绑定,最终调用了MyObj这个被修饰类的fun1()。使用这种隐秘的组合方式实现了装饰类调用被装饰类的能力方法。明白这个模式对于应用java还是非常重要的,因为经常会出现,了解了其调用流程就能从容应对这类代码语句,做到心中有数
相关文章推荐
- java 异常在实际应用中的总结
- Java Web 回顾总结(二) - Tomcat 实际应用
- Java String,StringBuilder,StringBuffer区别和实际应用总结
- Java GC机制及原理 项目实际遇到GC问题解决思路和经验总结
- myecplise上将工程部署到应用下时,经常出现 An internal error occurred during: "Add Deployment". java.lang.NullPointEx
- java 实际应用中的实验与总结
- 关于java异常在实际应用中经验与总结
- 总结Java+Oracle应用开发的常遇到几个问题
- java面试过程中经常遇到的一些试题的总结(1)
- <设计模式:java语言中的应用>摘要、总结
- 传智播客Java web之 Servlet应用的开发与映射总结
- log4j在实际开发中应用场合的一些"潜规则"
- Java数据结构应用——无序列表学习总结(一)
- 个人总结 DataTable 项目中经常遇到
- 事务处理是在数据处理时经常遇到的问题,经常用到的方法有以下3种总结整理如下
- 烧写flash遇到"no cfi table found"错误总结
- Java正则表达式应用总结
- 主题:java Filter的实际应用一例
- 项目开发中经常遇到的一些问题总结
- JAVA-近日遇到的java的日期时间类型的几个问题总结