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>、期待与您
交流!------

时间: 2024-11-02 20:22:37

Java基础之装饰类的相关文章

【Java菜鸟学习总结】Java基础知识(类)

目录 [Java菜鸟学习总结]Java基础知识(类) 1.面向对象编程 2.类 3.static关键字 4.final关键字 [Java菜鸟学习总结]Java基础知识(类) 1.面向对象编程 1.1.面向对象编程的特征 面向对象编程(OOP)的三大特征 { 封装; 继承; 多态; } 1.2.类与对象概述 类与对象是面向对象的核心概念. 类与对象 { 类; // 类是对于一类事物的描述,是抽象的.概念的定义. 对象; // 对象是实际存在的该类事物的每个个体,因而也别称为实例. } 2.类 2.

Java基础之File类的使用

Java基础之File类的使用 1.File类的构造方法和常用方法 2.对File中listFile(FileNameFilter name)学习 3.与File文件类相关的实现 File类的构造方法和常用方法: 在Java中File类在IO流中被频繁使用,可以使用一个文件路径来表示在特定位置上的文件,但是需要注意的是这个路径只表示一个文件抽象的概念, 文件到底在不在这个路径下是不确定,换句话说,是不能通过文件路径来判断文件是否存在. 构造方法 File(File parent, String 

黑马程序员--java基础之其他类

-------android培训.java培训.期待与您交流! ---------- Java基础中的其他对象:System 关于System类的用法: /* System:类中的方法和属性都是静态的 out:标准输出,默认是控制台 in:标准输入,默认是键盘 获取系统属性信息:Properties getProperties(); */ import java.util.*; class SystemDemo { public static void main(String[] args) {

java基础教程-常用类(四)

四.常用类 4.1字符串相关的类(String StringBuffer) 4.1.1String类   4.1.2StringBuffer类(代表可变的) 解释一下可变和不可变 String s1 = “hello”; String s2 = “world”; s1+=s2; 实际上又开辟了一块内存,将hello和world copy进去,s1指向新的内存 而StringBuffer只是在s1后面增加了一块内存,把world加上,不需要copy String与StringBuffer只有这一定

黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类

---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或文件夹封装成对象 (2)方便于对“文件”与“文件夹属性信息”进行操作 (3)File对象,可以作为参数传递给流的构造函数 (二)构造方法 * 通过File的构造函数创建File对象 方式1:File f = new File("c:\\a.txt"); 方式2:File f2 = newF

java基础系列--Calendar类

原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7136575.html 1.Calendar概述 Java官方推荐使用Calendar来替换Date的使用,Calendar与Date之间可以自由的进行转换,转换的纽带是time,使用Calendar的getTime()方法可以得到一个Date类型的对象,这个对象底层是使用Date的第二个带Long型参数的构造器创建的,这个Long型参数是Calendar中的time字段中保存的值,这个t

Java基础之String类的细节问题

本文转载自http://sarin.iteye.com/blog/603684/ 先来看一个例子,代码如下: Java代码   public class Test { public static void main(String[] args) { String str = "abc"; String str1 = "abc"; String str2 = new String("abc"); System.out.println(str == 

java基础,继承类题目:编写一个Java应用程序,该程序包括3个类:Monkey类、People类和主类 E

21.编写一个Java应用程序,该程序包括3个类:Monkey类.People类和主类 E.要求: (1) Monkey类中有个构造方法:Monkey (String s),并且有个public void speak() 方法,在speak方法中输出“咿咿呀呀......”的信息. (2)People类是Monkey类的子类,在People类中重写方法speak(),在speak方法 中输出“小样的,不错嘛!会说话了!”的信息. (3)在People类中新增方法void think(),在thi

Java基础之File类(十一)

java.io.File类代表系统文件名(路径和文件名). java.io.IOException:输入输出文件流异常处理类. File类的常见构造方法: public File(String pathname):以pathname为路径创建File对象,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储. public File(String parent,String child):以parent为父路径,child为子路径创建File对象. File的静态属性