java 装饰者类

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

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

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

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

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

 1 //1.创建一个需要继承的父类(或者需要扩展功能的类)
 2 class Person {
 3     public void study() {
 4         System.out.println("学习");
 5     }
 6 }
 7
 8 //2.装饰者类(子类)
 9 class Student1 extends Person{
10     //2.1子类中维护一个父类(被装饰者类)
11     Person student;
12     //2.2构造方法,里面传一个被装饰者类的对象
13     public Student1(Person student) {
14         this.student = student;
15     }
16
17     //2.3复写被装饰者类的 需要扩展的方法
18     @Override
19     public void study() {
20         student.study();
21         //2.4对方法进行扩展,添加“读书”这一方法
22         System.out.println("读书");
23     }
24
25 }
26
27 //3.类似前面的对被装饰者方法进行扩展另一个方法
28 class Student2 extends Person{
29     Person student;
30     public Student2(Person student) {
31         this.student  = student ;
32     }
33
34     @Override
35     public void study() {
36         // TODO Auto-generated method stub
37         student.study();
38         //另一个扩展方法,“写字”
39         System.out.println("写字");
40     }
41 }
42
43
44 class Student3 extends Person{
45     Person student;
46
47     public Student3(Person student) {
48         this.student  = student ;
49     }
50
51     @Override
52     public void study() {
53         // TODO Auto-generated method stub
54         student.study();
55         //另一个扩展方法,“画画”
56         System.out.println("画画");
57     }
58 }
59
60
61 public class readerExt {
62
63     public static void main(String[] args) {
64
65         //5.创建被装饰者类的对象
66         Person person = new Person();
67         person.study();  //学习
68
69         //5.1创建装饰者类(子类)的对象,传入被装饰者类的对象
70         Student1 s1 = new Student1(person);
71         s1.study();  //学习,读书
72
73         Student2 s2 = new Student2(person);
74         s2.study();  //学习,写字
75
76         //5.2 装饰者 互相装饰
77         Student3 s3 = new Student3(s2);
78         s3.study();  //学习,读书,画画
79
80     }
81 }
时间: 2024-10-13 14:40:15

java 装饰者类的相关文章

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

装饰者模式(Decorator Pattern) Java的IO类 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)参见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decora

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

装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)參见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 当中FilterInputStream类, 就是装饰者(decorato

Java装饰者模式

Java装饰者模式简介 一.假设有一个Worker接口,它有一个doSomething方法,Plumber和Carpenter都实现了Worker接口,代码及关系如下: 1.Worker.java package decorator; public interface Worker { public void doSomething(); } 2.Plumber.java public class Plumber implements Worker { @Override public void

java装饰设计模式的由来

装饰设计模式:基于已经存在的功能,提供增强的功能 装饰设计模式的由来: Reader   ----TextReader  ----MediaReader 要为子类提供缓冲读的功能 Reader   ----TextReader        ----BufferedTextReader   ----MediaReader       -----BufferedMediaReader Reader   ----TextReader        ----BufferedTextReader   -

Java Object根类

Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起.作为其他所有类的基类,Object具有哪些属性和行为,是Java语言设计背后的思维体现. Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入.Object类没有定义属性,一共有13个方法,具体的类定义结构如下图: 1.类构造器public Object(); 大部分情况下,Java中通过形如 new A(args..)形式创建一个属于该类型的对象.

设计模式-Python Java装饰者模式

装饰者模式定义 动态地将责任附加到对象上.若要扩展功能,装饰者提供比继承更有弹性的替代方案 实现类图 装饰者模式的特点 A 装饰者和被装饰对象有相同的超类型.(注意这是利用继承达到"类型匹配",而不是利用继承获得"行为",行为来自装饰者和基础组件,或者与其他装饰者之间的组合关系) B   可以用一个或多个装饰者包装一个对象. C 因为装饰者和被装饰者具有相同的类型,所以任何需要原始对象的场合,可以用装饰过的对象代替. D 装饰者可以在所委托被装饰者的行为之前与/或之

java单例类/

java单例类  一个类只能创建一个实例,那么这个类就是一个单例类 可以重写toString方法 输出想要输出的内容 可以重写equcal来比较想要比较的内容是否相等 对于final修饰的成员变量 一但有了初始值,就不能被重新赋值 static修饰的成员变量可以在静态代码块中 或申明该成员时指定初始值 实例成员可以在非静态代码块中,申明属性,或构造器中指定初始值 final修饰的变量必须要显示初始化 final修饰引用变量不能被重新赋值但是可以改变引用对象的内容分(只要地址值不变) final修

Java装饰器模式

意图:动态的将责任附加到对象上什么时候使用:1.在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责2.处理那些可以撤销的职责3.当不能采用生成子类的方式进行扩充时结构图: package com.test.patten.decorator; public interface Person { void doCoding(); } package com.test.patten.decorator; public class Employee implements Person { @

Java 对象和类

1.访问实例变量和调用成员方法: 2. 在该例子中,我们创建两个类:Employee 和 EmployeeTest. 首先打开文本编辑器,把下面的代码粘贴进去.注意将文件保存为 Employee.java. Employee类有四个成员变量:name.age.designation和salary.该类显式声明了一个构造方法,该方法只有一个参数. 程序都是从main方法开始执行.为了能运行这个程序,必须包含main方法并且创建一个实例对象. 下面给出EmployeeTest类,该类实例化2个 Em