首页 > 代码库 > Java基础之装饰类

Java基础之装饰类

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、ios培训、.Net培训</a>、期待与您
交流!------

Java基础之装饰类:
简介:
首先他是一种设计模式属于23种设计模式之一,英文叫Decorator Pattern。又叫装饰者模式。装饰模式是在不必改变原类文
件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象

好处:
1. Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

原则:
1. 多用组合,少用继承。
利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法
扩展对象的行为,就可以在运行时动态地进行扩展。
2. 对外扩展开放,对内修改关闭(跨平台性好,内部可以用也可以不用)。

什么情况下使用:
1. 需要扩展一个类的功能,或给一个类添加附加职责。
2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得
子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。


代码事例:
抽象构件角色java 代码
package decorator; 
/** 
* 装饰者和原组建的共同方法接口(抽象构件角色) 
* @author mouca.he 

*/ 
public interface InterfaceComponent { 

/** 
* 组件方法 say() 

*/ 
public void say(); 

具体构件角色java 代码

package decorator; 
/** 
* 原组件(具体构件角色) 
* @author mouca.he 

*/ 
public class Component implements InterfaceComponent{ 

public void say() { 
// TODO 自动生成方法存根 
System.out.println("Component.say():原组件的方法!"); 



抽象装饰者角色java 代码

package decorator; 
/** 
* 抽象装饰者 
* @author mouca.he 

*/ 
public abstract class AbstractDecorator implements InterfaceComponent{ 

private InterfaceComponent component; 

public AbstractDecorator(InterfaceComponent component){ 
this.component = component; 

/** 
* 组件方法执行前预处理方法 

*/ 
protected void preSay(){}; 

/** 
* 组件方法执行后处理方法 

*/ 
protected void afterSay(){}; 

public void say(){ 

preSay(); 
component.say(); 
afterSay(); 

}; 

具体装饰者二java 代码

package decorator; 
/** 
* 装饰者二 
* @author mouca.he 

*/ 
public class DecoratorTwo extends AbstractDecorator{ 

public DecoratorTwo(InterfaceComponent component) { 
super(component); 
// TODO 自动生成构造函数存根 


/** 
* 根据需要重载模板类preSay()方法 
*/ 
protected void preSay(){ 
System.out.println("DecoratorTwo.preSay():装饰者二的preSay()方法!"); 


/** 
* 根据需要重载模板类afterSay()方法 
*/ 
protected void afterSay(){ 
System.out.println("DecoratorTwo.afterSay():装饰者二的afterSay()方法!"); 



装饰者一java 代码

package decorator; 
/** 
* 装饰者一 
* @author mouca.he 

*/ 
public class DecoratorOne extends AbstractDecorator{ 

public DecoratorOne(InterfaceComponent component) { 
super(component); 
// TODO 自动生成构造函数存根 

/** 
* 根据需要重载模板类preSay()方法 
*/ 
protected void preSay(){ 
System.out.println("DecoratorOne.preSay():装饰者一的preSay()方法!"); 


/** 
* 根据需要重载模板类afterSay()方法 
*/ 
protected void afterSay(){ 
System.out.println("DecoratorOne.afterSay():装饰者一的afterSay()方法!"); 

/** 
* 测试方法 
* @param args 
*/ 
public static void main(String[] args) { 
// TODO 自动生成方法存根 
InterfaceComponent interfaceComponent = new DecoratorTwo(new DecoratorOne(new Component())); 
interfaceComponent.say(); 
/* 
* 控制台输出: 
* DecoratorTwo.preSay():装饰者二的preSay()方法! 
* DecoratorOne.preSay():装饰者一的preSay()方法! 
* Component.say():原组件的方法! 
* DecoratorOne.afterSay():装饰者一的afterSay()方法! 
* DecoratorTwo.afterSay():装饰者二的afterSay()方法! 
*/ 

}

 

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、ios培训、.Net培训</a>、期待与您
交流!------

Java基础之装饰类