zoukankan      html  css  js  c++  java
  • 设计模式—装饰模式

    装饰者模式:灵活的对一个对象的功能进行修改。

      优势:可以自由的对对象进行功能(行为)进行添加、删除操作。而不像继承那样会继承一些父类多余的方法。

    示例说明:创建两个人,一个正常的人(NormalPerson)可以进行呼吸、哭、说话、跑、跳、开车;另一个聋哑人只可以进行呼吸、跳、跑、哭。要求重用各种动作。

     类图如下:

    代码如下:

    定义一个Person的标准接口:

    package com.zpj.designMode.decorativePattern;
    
    public interface Person {
        public void action();
    }

    添加一个装饰者Decorator :

    复制代码
    package com.zpj.designMode.decorativePattern;
    
    /**
     * 严格意义上讲,被装饰者和装饰者需要实现相同的接口或者继承相同的父类 一个装饰者只能装饰同一类被装饰者,也即是 Decorator只能装饰
     * 实现Person接口的类型对象。
     */
    public class Decorator implements Person {
        protected Person per;
    
        public Decorator(Person per) {
            super();
            this.per = per;
        }
    
        @Override
        public void action() {
            System.out.println("------基本行为-----哭");
            per.action();
        }
    
    }
    复制代码

    构建各种功能:Drive

    复制代码
    package com.zpj.designMode.decorativePattern;
    
    public class Drive extends Decorator {
    
        public Drive(Person per) {
            super(per);
        }
    
        @Override
        public void action() {
            System.out.println("--------扩展功能--------开车");
            per.action();
        }
    
    }
    复制代码

    构建各种功能:Jump

    复制代码
    package com.zpj.designMode.decorativePattern;
    
    public class Jump extends Decorator {
    
        public Jump(Person per) {
            super(per);
        }
    
        @Override
        public void action() {
            System.out.println("--------扩展功能--------跳");
            per.action();
        }
    
    }
    复制代码

    构建各种功能:Run

    复制代码
    package com.zpj.designMode.decorativePattern;
    
    public class Run extends Decorator {
    
        public Run(Person per) {
            super(per);
        }
    
        @Override
        public void action() {
            System.out.println("--------扩展功能---------跑");
            per.action();
        }
    
    }
    复制代码

    构建各种功能:Say

    复制代码
    package com.zpj.designMode.decorativePattern;
    
    public class Say extends Decorator {
    
        public Say(Person per) {
            super(per);
        }
    
        @Override
        public void action() {
            System.out.println("--------扩展功能---------说");
            per.action();
        }
    
    }
    复制代码

    创建一个正常的人:NormalPerson

    复制代码
    package com.zpj.designMode.decorativePattern;
    
    public class NormalPerson implements Person {
    
        @Override
        public void action() {
            System.out.println("------生下来就会的------呼吸");
        }
    
    }
    复制代码

    创建一个聋哑人:UnNormalPerson

    复制代码
    package com.zpj.designMode.decorativePattern;
    
    public class UnNormalPerson implements Person {
    
        @Override
        public void action() {
            System.out.println("------生下来就会的------呼吸");
        }
    
    }
    复制代码

    进行测试:

    复制代码
    package com.zpj.designMode.decorativePattern;
    
    import org.junit.Test;
    
    public class TestUtil {
    
        @Test
        public void test01() {
            // 一个正常人,刚生下来会呼吸
            Person per = new NormalPerson();//会呼吸的人
            per = new Decorator(per);
            per = new Run(per);
            per = new Say(per);
            per = new Jump(per);
            per = new Drive(per);
            per.action();
            System.out.println("************************************************");
            // 一个聋哑人 不会说话,不能开车,刚生下来会呼吸
            Person per02 = new UnNormalPerson();//会呼吸的人
            per02 = new Decorator(per02);
            per02 = new Run(per02);
            per02 = new Jump(per02);
            per02.action();
            // 通过此种模式可以对对象随意的进行功能添加、删除,而不像继承那样会继承一些父类的不需要的方法
        }
    }
    复制代码

    装饰者模式可以很灵活的对对象进行功能添加或者删除。如果仅仅需要功能扩展,可以使用子类继承父类的方式进行功能扩展,但是如果需要功能删除,通过继承就没办法完成。另外,通过继承的方法会增加一些子类不需要的功能。所以使用装饰者模式对对象的功能操作更加灵活。

    以上结构只是标准的结构,在实际使用中可以去除Dectorator类,让Run Jump,Drive直接实现Person,甚至可以取消Person接口。

  • 相关阅读:
    JVM性能调优的6大步骤,及关键调优参数详解
    JVM内存调优原则及几种JVM内存调优方法
    关于大型网站技术演进的思考(十六)--网站静态化处理—前后端分离—下(8)
    关于大型网站技术演进的思考(十五)--网站静态化处理—前后端分离—中(7)
    关于大型网站技术演进的思考(十四)--网站静态化处理—前后端分离—上(6)
    关于大型网站技术演进的思考(十三)--网站静态化处理—CSI(5)
    关于大型网站技术演进的思考(十二)--网站静态化处理—缓存(4)
    关于大型网站技术演进的思考(十一)--网站静态化处理—动静分离策略(3)
    关于大型网站技术演进的思考(十)--网站静态化处理—动静整合方案(2)
    关于大型网站技术演进的思考(九)--网站静态化处理--总述(1)
  • 原文地址:https://www.cnblogs.com/zhangkeyu/p/6663861.html
Copyright © 2011-2022 走看看