• 装饰者模式(不太理解的设计模式)


    对于装饰者模式一直不太理解,不懂的他与桥接模式的区别在哪????

    23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

    装饰模式的特点编辑

    (1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
    (2) 装饰对象包含一个真实对象的引用(reference)
    (3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
    (4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

    装饰者与适配者模式的区别编辑

    1.关于新职责:适配器也可以在转换时增加新的职责,但主要目的不在此。装饰者模式主要是给被装饰者增加新职责的。
    2.关于原接口:适配器模式是用新接口来调用原接口,原接口对新系统是不可见或者说不可用的。装饰者模式原封不动的使用原接口,系统对装饰的对象也通过原接口来完成使用。(增加新接口的装饰者模式可以认为是其变种--“半透明”装饰者)
    3.关于其包裹的对象:适配器是知道被适配者的详细情况的(就是那个类或那个接口)。装饰者只知道其接口是什么,至于其具体类型(是基类还是其他派生类)只有在运行期间才知道。

    1、 Work.java     接口
      2、 Son.java      被装饰者-负责画画
      3、 Mother.java   装饰者-负责上颜色
      4、 Father.java   装饰者-负责装画框
      5、 DecoratorTest.java 带有main方法的测试类,

            模拟3种调用情况:A,只画画;

                             B,画画,上色;

                             C, 画画,上色,装框

    ===============   1、 Work.java
    package decorator;

    public interface Work {
      public void paint();
    }
    ===============   1   end

    ===============   2、 Son.java
    package decorator;

    public class Son implements Work {
      public void paint() {
        System.out.println("儿子用铅笔画好了一幅画。");
      }
    }
    ===============   2   end

    ===============   3、 Mother.java
    package decorator;

    public class Mother implements Work {

      //被装饰者
      private Work work;
     
      public Mother(Work work) {
        this.work = work;
      }
     
      private Mother() {}

      public void paint() {
       
        //妈妈装饰者做的职责
        System.out.println("妈妈正在做给画上颜色前的准备工作。");
       
        //被装饰者做的职责
        work.paint();
       
        //妈妈装饰者做的职责
        System.out.println("妈妈给画上好了颜色。");
      }

    }
    ===============   3   end

    ===============   4、 Father.java
    package decorator;

    public class Father implements Work {

      //被装饰者
      private Work work;
     
      public Father(Work work) {
        this.work = work;
      }
     
      private Father() {}

      public void paint() {
       
        //爸爸装饰者做的职责
        System.out.println("爸爸正在做上画框前的准备工作。");
       
        //被装饰者做的职责
        work.paint();
       
        //爸爸装饰者做的职责
        System.out.println("爸爸给画装好了一个画框。");
      }

    }
    ===============   4   end

    ===============   5、 DecoratorTest.java
    package decorator;

    public class DecoratorTest {

      public static void main(String[] args) {
       
        //只画铅笔画
        Work work = new Son();
        work.paint();   
        System.out.println(" ");
       
        //除了画铅笔画,还要给画上颜色
        work = new Mother(work);
        work.paint();
        System.out.println(" ");
       
        //除了画铅笔画,给画上颜色,还要给画上画框
        work = new Father(work);
        work.paint();
       
      }
    }
    ===============   5   end

    输出:
    儿子用铅笔画好了一幅画。


    妈妈正在做给画上颜色前的准备工作。
    儿子用铅笔画好了一幅画。
    妈妈给画上好了颜色。


    爸爸正在做上画框前的准备工作。
    妈妈正在做给画上颜色前的准备工作。
    儿子用铅笔画好了一幅画。
    妈妈给画上好了颜色。
    爸爸给画装好了一个画框。

  • 相关阅读:
    五大常用算法之一:分治算法
    【Redis实战】双写一致性问题和解决方案
    大厂面试官喜欢这样问Redis,双写一致性、并发竞争、线程模型,我整理好了
    布隆过滤器的原理以及使用场景
    死磕 Redis- 布隆过滤器
    布隆过滤器(Bloom Filter)原理及实现
    布隆过滤器(亿级数据过滤算法)
    Java防止SQL注入2(通过filter过滤器功能进行拦截)
    java项目中如何防止sql注入
    java如入防止sql注入
  • 原文地址:https://www.cnblogs.com/qiaozhoulin/p/4784033.html
Copyright © 2020-2023  润新知