当系统需要新的功能的时候,一般都是向旧的类中添加新的代码。比如一个人这个类,需要新增穿衣的功能,那么就会在人这个类中去添加对应的穿衣方法代码,用来增强人这个类的行为功能。但是这样做,会因为新加入的字段、方法等逻辑代码,导致原有 人 这个类变得复杂,新加入的穿衣功能并非 人  这个类的核心功能,穿衣只是某种情况下的特定功能,会与类中人的核心功能【比如吃饭】代码糅杂在一起。

  装饰模式,把要装饰的功能(穿衣)放在一个单独的类中,并让这个类包含他需要装饰的对象(人),当需要执行特定穿衣功能的时候,客户端灵活去装饰主类对象。这样可以使得主类(人)代码简洁,不会变的越来越复杂,使得主类 的核心功能 与    不断增加的 特定功能 分开,也能去重相关装饰逻辑,做到复用。

下面写一个例子:

创建人 类作为主类:

public class Person {

    //人的 核心功能  吃喝拉撒
    public void eat() {
        System.out.println("人的核心功能:吃喝拉撒");
    }

    //穿衣功能  新增
    public void show() {
        System.out.println("====完成穿衣");
    }
}

创建装饰抽象类:

 * @description :装饰抽象类
 */
public abstract class Decorate extends Person {

    //Decorate extends Person
    //Person是被装饰者,  Decorate是装饰者,两者有共同的父类,这里简化了用继承来表示这种关系。目的是表明二者为同一类型,二者本身行为属性没有任何逻辑上的继承关系

    //被装饰对象   人      类
    private Person person;

    //装饰操作方法,为了让子类调用,不能为private
    public void decorate(Person person) {
        this.person = person;
    }

    //装饰行为效果
    @Override
    public void show() {
        if(person != null) {
            person.show();
        }
    }

}

创建三个装饰类,继承上面的装饰抽象类,来实现具体的装饰过程效果:

 * @description :女仆装装饰类
 */
public class Nvzhuang extends Decorate {

    @Override
    public void show() {
        System.out.println("穿女仆装");
        super.show();
    }

}

 * @description :裤子装饰类
 */
public class Kuzi extends Decorate {
    @Override
    public void show() {
        System.out.println("穿裤子");
        super.show();
    }

}

 * @description :马甲装饰类
 */
public class Majia extends Decorate {
    @Override
    public void show() {
        System.out.println("穿马甲");
        super.show();
    }

}

测试主类:

 */
public class Main {

    public static void main(String[] args) {

        Person xiaomingPerson = new Person();//创建被装饰对象,小明

        Nvzhuang nvzhuang  = new Nvzhuang();//女装 装饰类
        Majia majia  = new Majia();//马甲装饰类
        Kuzi kuzi = new Kuzi();//裤子装饰类

        //如何装饰?随便自定义顺序
        nvzhuang.decorate(xiaomingPerson);// 把下面定义的穿衣装饰顺序 套到  目标对象上
        majia.decorate(nvzhuang);//先穿马甲,再穿女装
        kuzi.decorate(majia);  //先穿裤子,再穿马甲
        kuzi.show();

    }

}

效果:

穿裤子
穿马甲
穿女仆装
====完成穿衣

注意: 代码中的装饰顺序是 女仆装、马甲,裤子, 运行效果却是 裤子、马甲、女仆装 ,顺序是反过来的,这其实就是在

nvzhuang.decorate(xiaomingPerson);// 把下面定义的穿衣装饰顺序 套到 目标对象上
majia.decorate(nvzhuang);//先穿马甲,再穿女装
kuzi.decorate(majia); //先穿裤子,再穿马甲

代码进行层层递进,最终到达裤子的时候,调用

 kuzi.show();开始进行装饰,裤子装饰完成后会调用上一层的装饰对象的装饰方法进行装饰。依次往回递进。

======================================

最新文章

  1. 笔记 线程(threads)
  2. java.lang.OutOfMemoryError: PermGen space异常处理(内存溢出)
  3. iOS开发 字符串MD5加密
  4. C#学习7
  5. qregularexpression和qregexp的区别
  6. 剑指Offer46 求1+2+...+n
  7. iOS 跳转到应用所在的App Store市场
  8. 绝美Sysinternals
  9. IT工程师值得一看的书籍
  10. jdk、jre与jvm的区别与联系
  11. JAVA项目复习的一些小细节
  12. Unix Shortcuts
  13. js前端ajax提交list集合参数至后端
  14. 同步调用异步方法how-would-i-run-an-async-taskt-method-synchronously
  15. Linux权限赋予远程连接MySQL
  16. nyoj-0708-ones(dp)
  17. [HAOI2006]l旅行
  18. Unity 3D游戏-消消乐(三消类)教程和源码
  19. zabbix出现中文不能选的情况
  20. Dell 服务器安装方法介绍

热门文章

  1. 【转】13个JavaScript图表(JS图表)图形绘制插件
  2. 速石科技携HPC混合云平台亮相AWS技术峰会2019上海站
  3. JavaScript面向对象 实例与原型
  4. python递归(函数)
  5. Django HttpResponse、render、redirect
  6. 13.系统总结static
  7. NABCD项目分析
  8. 【杂项】各类文件头结合winhex使用-转载
  9. windows命令行(终端)怎么复制粘贴
  10. 基于Bootstrap和Knockout.js的ASP.NET MVC开发实战