• 大话设计模式之装饰器模式


    背景:

    一个人出去约会,给这个人添加一些装饰如穿什么样的上衣、下衣、领带、鞋子等等。

    装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

    UML类图:

    被装饰的具体对象Person类:

     1 public class Person {
     2 
     3     private String name;
     4 
     5     public Person() {
     6     }
     7 
     8     public Person(String name) {
     9         this.name = name;
    10     }
    11 
    12     public void show(){
    13         System.out.println(" 装饰的" + name);
    14     }
    15 }

    抽象的装饰器类Decorate:

     1 public class Decorate extends Person {
     2 
     3     protected Person component;
     4 
     5     public void decorate(Person person){
     6         this.component = person;
     7     }
     8 
     9     @Override
    10     public void show() {
    11         if(component != null){
    12             component.show();
    13         }
    14     }
    15 }

    装饰器A DecorateA:

    1 public class DecorateA extends Decorate {
    2 
    3     @Override
    4     public void show() {
    5         System.out.println("装饰A");
    6         super.show();
    7     }
    8 }

    装饰器B DecorateB:

    1 public class DecorateB extends Decorate {
    2 
    3     @Override
    4     public void show() {
    5         System.out.println("装饰B");
    6         super.show();
    7     }
    8 }

    测试类:

     1 public class Main {
     2 
     3     public static void main(String[] args) {
     4         System.out.println("Hello World!");
     5         Person person = new Person("David");
     6         Decorate decorateA = new DecorateA();
     7         Decorate decorateB = new DecorateB();
     8         decorateA.decorate(person);
     9         decorateB.decorate(decorateA);
    10         decorateB.show();
    11     }
    12 }

    总结:

    在起初的设计中,当系统需要新功能额时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为,但是这种做法的问题在于,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。而装饰模式却提供了一个非常好的解决方案,它吧每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择的、按顺序的使用装饰功能包装对象了。

    典型应用是JDK中的IO操作。

  • 相关阅读:
    Linux kernel AACRAID Driver Compat IOCTL 本地安全绕过漏洞
    WordPress Contact Form 7插件任意文件上传漏洞
    文件上传
    Po类设计
    MySQL 表设计
    Mybatis——更新DB表的字段时,应该注意的点
    分页——为Mybatis配置PageHelper
    SpringAOP配置与使用(示例)
    日志问题
    为一台全新的电脑构建JavaEE开发环境
  • 原文地址:https://www.cnblogs.com/xiaosiyuan/p/9096153.html
Copyright © 2020-2023  润新知