结构型模式--装饰模式(Decorator)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 结构型模式--装饰模式(Decorator)

结构型模式--装饰模式(Decorator)

 2013/8/1 13:08:45  李永  程序员俱乐部  我要评论(0)
  • 摘要:顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下:Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能,代码如下:[java]viewplaincopypublicinterfaceSourceable{publicvoidmethod();}[java]viewplaincopypublicclassSourceimplementsSourceable
  • 标签:ORA 模式 装饰模式

顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下:

Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能,代码如下:

[java]?view plaincopy
  1. public?interface?Sourceable?{??
  2. ????public?void?method();??
  3. }??
[java]?view plaincopy
  1. public?class?Source?implements?Sourceable?{??
  2. ??
  3. ????@Override??
  4. ????public?void?method()?{??
  5. ????????System.out.println("the?original?method!");??
  6. ????}??
  7. }??
[java]?view plaincopy
  1. public?class?Decorator?implements?Sourceable?{??
  2. ??
  3. ????private?Sourceable?source;??
  4. ??????
  5. ????public?Decorator(Sourceable?source){??
  6. ????????super();??
  7. ????????this.source?=?source;??
  8. ????}??
  9. ????@Override??
  10. ????public?void?method()?{??
  11. ????????System.out.println("before?decorator!");??
  12. ????????source.method();??
  13. ????????System.out.println("after?decorator!");??
  14. ????}??
  15. }??

测试类:

[java]?view plaincopy
  1. public?class?DecoratorTest?{??
  2. ??
  3. ????public?static?void?main(String[]?args)?{??
  4. ????????Sourceable?source?=?new?Source();??
  5. ????????Sourceable?obj?=?new?Decorator(source);??
  6. ????????obj.method();??
  7. ????}??
  8. }??

输出:

before decorator!
the original method!
after decorator!

装饰器模式的应用场景:

1、需要扩展一个类的功能。

2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)

缺点:产生过多相似的对象,不易排错!

?

==================================================================
?另外一个例子

/** * Test.java 
* Created on 2013-8-1 上午10:02:29 
*/

package my;

/** 
 * <p>Project: Test2</p> 
 * <p>Title: Test.java</p> 
 * <p>Description: </p> 
 * <p>Copyright (c) 2013 Wilmar Consultancy Services</p>
 * <p>All Rights Reserved.</p>
 * @author <a href="mailto:liyong@wcs-global.com">liyong</a>
 */

public class Test {

	public static void main(String[] args) {

		Teacher t1 = new SimpleTeacher();

		Teacher t2 = new CppTeacher(t1);

		Teacher t3 = new JavaTeacher(t2);

		t3.teach();

		// t.teach();

	}

}

abstract class Teacher {

	public abstract void teach();

}

class SimpleTeacher extends Teacher {

	public void teach() {

		System.out.println("Good Good Study, Day Day Up");

	}

}

class JavaTeacher extends Teacher {

	Teacher teacher;

	public JavaTeacher(Teacher t) {

		this.teacher = t;
	}

	public void teach() {

		teacher.teach();

		System.out.println("Teach Java");

	}

}

class CppTeacher extends Teacher {

	Teacher teacher;

	public CppTeacher(Teacher t) {

		this.teacher = t;

	}

	public void teach() {

		teacher.teach();

		System.out.println("Teach C++");

	}

}

?

发表评论
用户名: 匿名