首页 > 代码库 > 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基础之装饰类