zoukankan      html  css  js  c++  java
  • 大话设计模式之装饰器模式

    背景:

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

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

    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操作。

  • 相关阅读:
    考勤助手——基于CS三层结构的子系统设计
    淘宝网架构分析——反向代理
    软件架构风格——解释器风格详析
    软件架构风格
    考勤助手类图的设计
    任课教师管理考勤子系统之用例图
    考勤助手ER图2.0版本所存在的问题
    关于“考勤助手”体系架构风格的选取
    浅谈CDN技术的性能与优势
    软件体系结构——解释器风格的浅解
  • 原文地址:https://www.cnblogs.com/xiaosiyuan/p/9096153.html
Copyright © 2011-2022 走看看