zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    【随机过程】随机过程之泊松过程的直观理解
    【随机过程】随机过程之泊松过程的直观理解
    【读书笔记】程序员的自我修养总结(四)
    【读书笔记】程序员的自我修养总结(四)
    【编程开发】CMake相关注意事项
    【编程开发】CMake相关注意事项
    【随机过程】几种容易混淆的概率分布
    【随机过程】几种容易混淆的概率分布
    【DSP开发】DSP能用VS2010生成的链接库文件吗?
    【DSP开发】DSP能用VS2010生成的链接库文件吗?
  • 原文地址:https://www.cnblogs.com/bigerf/p/6143314.html
Copyright © 2011-2022 走看看