装饰者模式:增强一个类的功能还可以让装饰者类之间互相装饰。

装饰者模式和继承的区别:

继承实现的增强类:
  优点:代码结构清晰,而且实现简单
  缺点:对于每一个的需要增强的类都要创建具体的子类来帮助其增强,这样会导致继承体系过于庞大。

装饰模式实现的增强类:
  优点:内部可以通过多态技术对多个需要增强的类进行增强
  缺点:需要内部通过多态技术维护需要增强的类的实例。进而使得代码稍微复杂。

下面来个例子来实现装饰者模式的效果

 //1.创建一个需要继承的父类(或者需要扩展功能的类)
class Person {
public void study() {
System.out.println("学习");
}
} //2.装饰者类(子类)
class Student1 extends Person{
//2.1子类中维护一个父类(被装饰者类)
Person student;
//2.2构造方法,里面传一个被装饰者类的对象
public Student1(Person student) {
this.student = student;
} //2.3复写被装饰者类的 需要扩展的方法
@Override
public void study() {
student.study();
//2.4对方法进行扩展,添加“读书”这一方法
System.out.println("读书");
} } //3.类似前面的对被装饰者方法进行扩展另一个方法
class Student2 extends Person{
Person student;
public Student2(Person student) {
this.student = student ;
} @Override
public void study() {
// TODO Auto-generated method stub
student.study();
//另一个扩展方法,“写字”
System.out.println("写字");
}
} class Student3 extends Person{
Person student; public Student3(Person student) {
this.student = student ;
} @Override
public void study() {
// TODO Auto-generated method stub
student.study();
//另一个扩展方法,“画画”
System.out.println("画画");
}
} public class readerExt { public static void main(String[] args) { //5.创建被装饰者类的对象
Person person = new Person();
person.study(); //学习 //5.1创建装饰者类(子类)的对象,传入被装饰者类的对象
Student1 s1 = new Student1(person);
s1.study(); //学习,读书 Student2 s2 = new Student2(person);
s2.study(); //学习,写字 //5.2 装饰者 互相装饰
Student3 s3 = new Student3(s2);
s3.study(); //学习,读书,画画 }
}

java 装饰者类的更多相关文章

  1. 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法

    装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716 ...

  2. JAVA装饰器模式

    Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式. 一.定义: Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样 ...

  3. java.lang.Object类

    Object类是java所有对象的基类,包含着java最核心和最基础的类,在编译时会自动导入.具体的类结构图: 1.构造器 public Object(); 大部分情况下,Java中通过形如 new ...

  4. Java装饰者模式(Decorator)

    一.定义 装饰模式的设计理念主要是以对客户端透明的方式动态扩展对象的功能,是继承关系的一个替代(继承会产生大量的子类,而且代码有冗余).装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展.装饰 ...

  5. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  6. 基础知识(05) -- Java中的类

    Java中的类 1.类的概念 2.类中的封装 3.对象的三大特征 4.对象状态 5.类与类之间的关系 ------------------------------------------------- ...

  7. java中Inetaddress类

    InetAddress类 InetAddress类用来封装我们前面讨论的数字式的IP地址和该地址的域名. 你通过一个IP主机名与这个类发生作用,IP主机名比它的IP地址用起来更简便更容易理解. Ine ...

  8. Java集合---Array类源码解析

    Java集合---Array类源码解析              ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Prim ...

  9. 浅析Java.lang.ProcessBuilder类

    最近由于工作需要把用户配置的Hive命令在Linux环境下执行,专门做了一个用户管理界面特地研究了这个不经常用得ProcessBuilder类.所以把自己的学习的资料总结一下. 一.概述      P ...

随机推荐

  1. 洛谷 P1608 路径统计

    P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...

  2. mysql 时间戳格式化函数from_unixtime使用说明

    我们一般使用字段类型int(11)时间戳来保存时间,这样方便查询时提高效率.但这样有个缺点,显示的时间戳,非常难知道真实日期时间. mysql提供了一个时间戳格式化函数from_unixtime来转换 ...

  3. UVa 1531 - Problem Bee

    题目:如图所看到的的蜂巢型的图中.蜜蜂想从A点飞到B点,假设A与B不在同一个正六边形中, 则它先飞到A的中心.每次飞到相邻格子的中心,最后飞到B的中心,再飞到B点: 假设在一个格子中.直接飞过去就可以 ...

  4. C语言之基本算法25—牛顿迭代法求方程近似根

    //牛顿迭代法! /* ============================================================ 题目:用牛顿迭代法求解3*x*x*x-2*x*x-16 ...

  5. 为什么有些信号线串接33R小电阻?

    本人只是刚入坑的硬件助理,一名小白,很多都知识不懂,以下信息多数来自网络,可能不准确,恳请批评指正! 正文: 参考资料:http://blog.csdn.net/xiangyuqxq/article/ ...

  6. iOS平台加入Google Admob -1/2(Unity3D开发之七)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com.谢谢! 原文地址: http://www.cocos2dev.com/?p=567 Unity调用iOS还是非 ...

  7. [计算机]如何在win7下查看并更改文件的默认后缀名

    如何在win7下查看默认文件的后缀名并更改呢? 例如有一个文件本来是exe,想变更为txt.但是无法看到后缀名,就无法更改. 双击桌面上的计算机图标,或者任意盘符界面,单击如下图左侧“组织”右侧的下拉 ...

  8. JSP-Runood:Eclipse JSP/Servlet 环境搭建

    ylbtech-JSP-Runood:Eclipse JSP/Servlet 环境搭建 1.返回顶部 1. Eclipse JSP/Servlet 环境搭建 本文假定你已安装了 JDK 环境,如未安装 ...

  9. jQuery:has()和jQuery:contains()及jQuery:empty

    jQuery:has()和jQuery:contains()两个方法比较类似.不同点在于: has是判断标签的 contains是判断文本的 1.jQuery:has() <div>< ...

  10. sql的where条件中包含中文,查询不出来的处理方法

    SELECT  * FROM phonenumber_info where PROVANCE=N'广东' and  CITY=N'中山市'